每日一算法之选择排序原理及实现

更多精彩内容,请见:http://www.16boke.com


by zxy,QQ群:168424095

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

基本思想:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,
使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。…… ③
第i趟排序 第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。
该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,
使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,
将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的
元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,
有比当前外层循环位置更小的元素,需要将这两个元素交换.

【示例】:初始关键字 [49 38 65 97 76 13 27 49] 
 第一趟排序后 13 [38 65 97 76 49 27 49]
 第二趟排序后 13 27 [65 97 76 49 38 49]
 第三趟排序后 13 27 38 [97 76 49 65 49]
 第四趟排序后 13 27 38 49 [76 97 65 49]
 第五趟排序后 13 27 38 49 49 [97 65 76]
 第六趟排序后 13 27 38 49 49 65 [97 76]
 第七趟排序后 13 27 38 49 49 65 76 [97]
 最后排序结果 13 27 38 49 49 65 76 97 

int* selectsort(int num,int* e)
{
    int index=0;
int midparam=*e;
for(int i=0;i {
index=i;
for(int j=i;j {
if(e[j] {
index=j;
}
}
midparam=e[index];
e[index]=e[i];
e[i]=midparam;

cout << "第" << i+1 << "趟的排序结果:";

for(int r=0;r cout << e[r] << "  ";
}


cout << endl;
}

return e;

}


更多精彩内容,请见:http://www.16boke.com

你可能感兴趣的:(数据结构,C/C++)