经典排序之 选择排序
现在简单来讲一下选择排序的思想:
我们接触选择排序的时间很长了,也是我们编程时需要最先接触的程序。他的思想确实较简单。
算法思想:
选择排序需要针对数组从头到尾进行扫描,其实就是记录下扫描一遍后整个数组的最小元素和最小元素的位置,然后和第一个元素进行交换,这样经过一遍排序我们就可以确定一个元素的最终位置;然后从第二个数据开始再次循环扫描交换,直到最后;在这里交换时有一个优化的过程,如果最小元素的位置和之前记录的位置一样,则可以通过比较,避免无谓的交换,节省时间和空间。
选择排序是一个不稳定的排序,最好最坏和平均下来的时间复杂度都是O(n2);
算法实现:
1 #include<iostream> 2 using namespace std; 3 4 void swap(int &a, int &b){ 5 int temp = a; 6 a = b; 7 b = temp; 8 } 9 10 void selectSort(int *data, int length){ 11 12 if(data == NULL || length < 0){ 13 return; 14 } 15 16 for(int i = 0; i < length - 1; i++){ 17 int value = data[i]; 18 int index = i; 19 20 for(int j = i + 1; j < length; j++){ 21 if(data[j] < value){ 22 value = data[j]; //记录每一次的最小值 23 index = j; //记录每一次的索最小值索引 24 } 25 } 26 27 if(index == i){ //简单优化 28 continue; 29 } 30 31 swap(data[i], data[index]); //交换阶段 32 } 33 } 34 35 int main(){ //测试代码 36 int str[] = {34, 23, 4, 78, 1, 0, 45, 9, 33, 6, 234}; 37 int len = sizeof(str) / sizeof(int); 38 selectSort(str, len); 39 40 for(int k = 0; k < len; k++){ 41 cout<< str[k]<< ' '; 42 } 43 44 return 0; 45 }