前言:本文是在作者学习排序算法时所撰写,主要分享一些学习的经验以及一些细节。
排序算法稳定性、时间空间复杂度透析
1.选择排序
问题:选择排序为什么是不稳定的排序,能不能在不改变时间和空间复杂度的情况将其优化为稳定的排序算法。
1.1回顾选择排序原理
选择排序分为升序和降序排序,升序:让第一个元素与后面的每一个元素比较,如果发现有比自己小的就交换位置(其实优化后的排序只是更新最小值的位置并没了立即交换位置,而是等待第一轮循环结束后才交换位置),然后继续往下比较,第一轮比较完毕后,最小的元素就被交换到了index = 0的位置,下一轮循环就从第二个元素开始比较,以此类推。降序:每次循环找出最大的那个元素,让它与第一个元素交换位置,第一轮比较完毕后,最大的元素就被交换到了index = 0的位置,以此类推。
备注:无论是将最小值放到最后一个位置来达到降序排序还是将最大值放到最后一个位置来达到升序排序结果都是一样,取决于个人的编码习惯。
1.2选择排序稳定性透析
先来看一个例子,对【5,2,3,5,1,2,1】使用选择排序进行升序排序。代码示例如下!
public static void selectionSortAsc(int[] arr) {
System.out.println("原数组:" + Arrays.toString(arr));
System.out.println("-------------------------------");
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
//如果交换的位置是自己 就不交换
if (minIndex == i) continue;
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
System.out.println(Arrays.toString(arr));
}
}

在排序过程中,第一个5和第二个5的相对位置发生了变化,第一个2和第二个2的相对位置也发生了变化,排序完成后,两个5的相对位置又和排序前保持一致相当于恢复了稳定,但是两个2的相对位置较排序前依然发生了改变,依然不稳定。
问题:既然两个5在排序过程中失去了平衡,但最终还是恢复了平衡,会不会存在一种情况,在排序过程中有许多的元素失去了平衡,但是排序结束后又都恢复了平衡呢?
我的答案是肯的,肯定会存在这种情况,但是一个排序算法的稳定性是要对每一组排序数据都稳定,也就是说只要存在一组排序数据不稳定,那么这个算法就是不稳定的排序算法。
1.3选择排序写法2
这种写法效率并没有上述写法搞,我想表达的内容是无论你采用哪种写法,对于选择排序来说,稳定性都不会发生变化,依然不稳定。
public static void selectionSort(

最低0.47元/天 解锁文章
1129

被折叠的 条评论
为什么被折叠?



