二、选择排序(O(n^2)、不稳定)
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置(或末尾位置),直到全部待排序的数据元素排完。
选择排序不稳定的原因:
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,
依次类推,直到第n-1个元素,第n个 元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,
如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么 交换后稳定性就被破坏了。
比较拗口,举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被 破坏了,所以选择排序不是一个稳定的排序算法。
选择排序第一种写法:
int a[10] = { 3,5,1,7,2,4,6,9,8,0 };
//选择排序,从i开始往后找,找到一个最小的,将a[i]与其交换,即放到数组的第一个位置,然后i++,继续
//从i开始往后找最小的,找到后与a[i]交换,即放到数组的第二个位置,如此循环,直到i为最后一个元素的位置,则数组排好序
int min, i,j,t;
for (i = 0;i < 10 ;i++) {
min = i;
for (j = i;j < 10;j++) {
if (a[j] < a[min]) {
min = j;
}
}
if(j!=min){
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
//输出排序结果
for (int i = 0;i < 10;i++) {
cout << a[i] << endl;
}
选择排序第二种写法:
int a[10] = { 3,5,1,7,2,4,6,9,8,0 };
/*选择排序,从每一次从前j个数中找出最大的数,再跟a[j]交换,然后j--,再重新查找前j个数中最大的数,如此循环,直到j=0,全部排完。*/
int max, i,j,t;
for (j = 9;j > 0;j--) {
max = j;
for (i = 0;i <= j;i++) {
if (a[i] > a[max]) {
max = i;
}
}
if(j!=max){
t = a[max];
a[max] = a[j];
a[j] = t;
}
}
//输出排序结果
for (int i = 0;i < 10;i++) {
cout << a[i] << endl;
}