选择排序(Selection Sort)
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对个元素的表进行排序总共进行至多次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。 ---维基百科
选择排序的基本思想:
给定数组:int[] arr={里面n个数据};
第1趟排序,在待排序数据arr[1]~arr[n-1]中选出最小的数据,将它与arr[0]交换;
第2趟,在待排序数据arr[2]~arr[n-1]中选出最小的数据,将它与arr[1]交换;
以此类推,第i趟在待排序数据arr[i]~arr[n-1]中选出最小的数据,将它与r[i-1]交换,直到全部排序完成。
举例:数组 int[] arr={4,6,3,2,1,5};
-------------------------------------------------------
第一趟排序: 原始数据:4 6 3 2 1 5
最小数据1,把1放在首位,也就是4和1互换位置,
排序结果:1 6 3 2 4 5
-------------------------------------------------------
第二趟排序:
第1以外的数据{6 3 2 4 5}进行比较,2最小,2和6 交换
排序结果:1 2 3 6 4 5
-------------------------------------------------------
第三趟排序:
除1、2以外的数据{ 3 6 4 5}进行比较,3最小,不用换
排序结果:1 2 3 6 4 5
-------------------------------------------------------
第四趟排序:
除第1、2、3以外的其他数据{6 4 5}进行比较,4最小,6和4交换
排序结果:1 2 3 4 6 5
-------------------------------------------------------
第五趟排序:
除第1、2、3、4以外的其他数据{6 5}进行比较,5最小,5和6交换
排序结果:1 2 3 4 5 6
-------------------------------------------------------
示例代码如下:
public static void SelectSort(int[] arr){
for(int i = 0 ;i<arr.length-1;i++){ // i表示需要排序的趟数
int min = i; // 按照从小到大的顺序排列 设min为最小的下标所在的数
for(int j = i+1;j<arr.length;j++){ //从min下标所在的下一个位置开始
if(arr[min] > arr[j]){
min = j; // 找到数组中最小的数字的下标 赋值给min
}
}
// 如果要替换的位置为自己本身所在位置不交换无意义 见示例中的第三趟排序:
if(min != i ){
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
以下是选择排序复杂度:
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|
O(n²) | O(n²) | O(n²) | O(1) |
选择排序的简单和直观名副其实,这也造就了它”出了名的慢性子”,无论是哪种情况,哪怕原数组已排序完成,它也将花费将近n²/2次遍历来确认一遍。即便是这样,它的排序结果也还是不稳定的。 唯一值得高兴的是,它并不耗费额外的内存空间。