每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法,但又是新手程序猿需要掌握的算法。。。所以写下供参考
思路:(来自百度百科)
①初始状态:无序区为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(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
1 #include<iostream> 2 using namespace std; 3 void main() 4 { 5 6 int num[10] = {9,8,10,3,4,6,4,7,2,1}; 7 int *p=&num[0]; 8 cout<<"排序前:"<<endl; 9 for (int m = 0;m < 10;m++) 10 { 11 cout<<num[m]<<" "; 12 } 13 14 15 for (int i = 0;i < 9;i++) 16 { 17 int pos = i; 18 for (int j = i+1;j < 10;j++) 19 { 20 if (*(p+pos) > *(p+j)) 21 { 22 pos = j; 23 } 24 } 25 int tem; 26 tem = *(p+pos) ; 27 *(p+pos) =*(p+i); 28 *(p+i) = tem; 29 } 30 31 cout<<endl<<"排序后:"<<endl; 32 for (int m = 0;m < 10;m++) 33 { 34 cout<<num[m]<<" "; 35 } 36 }