排序
简单选择排序:
基本思想:选择排序的主要操作是选择,其主要思想是:每趟排序在当前待排序序列中选出关键码最小的记录,添加到有序序列中。 第i 趟在n-i+1(i=1,2,…,n-1)个记录中选取关键码最小的记录作为有序序列中的第i个记录。选择排序的特点就是记录移动的次数比较少。当读者听到这个名字—简单选择排序,是不是就觉得很简单呢?其实,简单选择排序思想也比较简单,比上一节的快速排序可能更好理解。
下面来通过一个例子简单了解下吧。
具体实现过程:
(1)将整个序列划分成有序区和无序区,初始化有序区为空,无序区为整个待排序列。
(2)在无序区中选取最小记录,将它与无序区中的第一个交换,使得有序区的记录扩展了一个,同时无序区的记录少了一个。
(3)重复第二步,知道无序区只剩下一个记录为止,此时全部记录都为从小到大的有序序列。
/**
* 选择排序:简单选择排序
*/
@Override
public void selectSort(T[] t) {
for(int i = 0; i < t.length; i++){ //对n个记录进行n趟简单选择排序
T min = t[i];
int minIndex = i; //标记最小记录位置
for(int j = i+1; j < t.length; j++){ //在无序区中选择最小记录
if(compare(t[j], min)){ // t[j] 小于 min 返回true
min = t[j];
minIndex = j;
}
}
t[minIndex] = t[i]; // 将最小记录与无序区第一个交换
t[i] = min;
}
System.out.println("简单选择排序:");
print(t);
}
上面的compare 、 print 方法将在讲解完全部排序介绍,这里仍然才用泛型。
性能分析:
(1)可以看出,简单选择排序记录的移动次数较少,待排序列为正序时,移动次数最少,为0次;待排序列为逆序时,移动次数最多,为3(n-1)次。
(2)无论记录的初始序列如何,关键码的比较次数相同,第i趟排序需要进行n-i 次比较,而又要需要n次排序,所以总的比较次数为 O(N*N)。
(3)所以简单选择排序,最好、最坏的时间性能为 O(N*N)。
稳定性:
若两个记录A和B值相等,但是排序后A、B的先后次序保持不变,则这种排序是稳定的,否则就是不稳定。简单选择排序是一种不稳定的排序算法。