版权声明:转载请注明原文地址。 https://blog.csdn.net/qq_39240270/article/details/86931690
选择排序的实现思想
在未排序序列中找到最小元素,放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾,循环直到所有元素军排序完毕。
- 初始状态:无序区为S[1,2,…,n],有序区为空;
- 第i趟排序(i = 1,2,3,…,n-1)开始时,当前有序区和无序区分别为S[1…i-1]和S[i…n]。该趟排序从当前无序区中选出最小的记录S[s],将它与无序区的第1个记录S[i]交换,使S[1…i]和S[i+1…n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
- 循环n-1次,排序完成。
Java实现选择排序
public class SelectionSort {
public static void selectionSort(int[] a){
int minIndex,temp;
for(int i = 0;i < a.length-1;i ++){//外层循环,代表着无序区,从第一个元素开始,直到倒数第二个元素结束,时间复杂度为O(N)
minIndex = i;//假设无序区第一个元素为最小元素
for(int j = i+1;j < a.length-i;j++){//内层循环,用于找出无序区最小元素,从无序区第二个元素开始比较,到无序区最后一个元素,时间复杂度为O(N)
if(a[minIndex] > a[j]){
minIndex = j;//当无序区中有元素小于假设的最小元素时,交换索引
}
}
//找到了无序区最小的元素,将该最小元素与无序区第一个元素进行交换,然后进行下一轮比较
temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
//测试
public static void main(String[] args) {
int[] a = {5,10,64,3,4,1,6};
System.out.println("排序前:" );
for (int i : a) {
System.out.print(" " + i);
}
SelectionSort.selectionSort(a);
System.out.println();
System.out.println("排序后:" );
for (int i : a) {
System.out.print(" " + i);
}
}
}
测试结果:
选择排序的总结
选择排序为两层for循环嵌套,时间复杂度为O(N2),内层循环始终去找最小值,放到最前面。交换次数比冒泡排序少很多,所以实际执行效率比冒泡排序快。衍生算法,双向选择排序(每次循环,同时选出最大值放在末尾,最小值放在前方),可以提高选择效率。
选择排序最好和最坏的情况一样运行了O(N2),但是选择排序无疑比冒泡排序更快,因为它进行的交换少得多,当N值较小时,特别是如果交换时间比比较时间大的多时,选择排序实际上是相当快的。平均时间复杂度也是O(N2)。
算法是不稳定的,假设a=b,且a在b前面,而某次循环中最小值在b后面,而此最小值需要跟a交换位置,这时候b就在a前面了,所以选择排序时不稳定的。
看见复杂度为O(1),不需要额外的空间。