第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,直到整个序列按关键码有序。
程序如下:
#include <iostream> using namespace std; void print(int a[], int n ,int i) /*打印出当前数组中的值*/ { int j; cout<<"第"<<i+1 <<"次 : "; for(j= 0; j<8; j++) { cout<<a[j] <<" "; } cout<<endl; } void select_sort(int a[], int n) { int tmp, i; int index, min_index; for(i=0; i < n; ++i) /*选择每次应该放在下标为i的单元的数*/ { for(index=i, min_index=i; index < n; index++) /*找出从当前i到数组末尾的最小值*/ { if(a[index] < a[min_index]) min_index = index; } if(min_index != i) /*如果查找到下标不是起始下标,做交换*/ { tmp = a[i]; a[i] = a[min_index]; a[min_index] = tmp; } print(a, n , i); /*打印出这步进行完的结果*/ } } int main() { int a[8] = {3, 1, 5, 7, 2, 4, 8, 6}; cout<<"初始值:"; for(int j= 0; j < 8; j++){ cout<<a[j] <<" "; } cout<<endl<<endl; select_sort(a, sizeof(a)/sizeof(int)); return 0; }程序运行结果:
选择排序的特点:
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:不稳定,举个简单的例子来说明一下,有序列3, 3, 4, 1, 5使用选择排序实现排序,那么首先位置1的3就会和位置4的1进行交换,那么原来位置1和位置2的两个3的相对位置就发生了变化,这种情况就可能导致最终两个3的前后位置发生了变化。
原文地址:http://blog.csdn.net/laoniu_c/article/details/38559387