数据结构与算法——十个排序算法之二 · 选择排序
选择排序:
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间,假如有几个妹子,用她们的身高给出一个数组,数据如下:
163 | 161 | 158 | 163 | 171 | 170 | 165 | 159 | 162 |
让我们用身高从低到高给她们排序,常见的思维如下:
1. 先找出所有妹子中身高最高的,与最后一个数交换
163 | 161 | 158 | 163 | 171 | 170 | 165 | 159 | 162 |
163 | 161 | 158 | 163 | 162 | 170 | 165 | 159 | 171 |
2. 再找出除最后一位外其它妹子中的最高者,与倒数第二个交换位置
163 | 161 | 158 | 163 | 162 | 170 | 165 | 159 | 171 |
163 | 161 | 158 | 163 | 162 | 159 | 165 | 170 | 171 |
3. 再找出除最后两位外其它妹子中的最高者,与倒数第三个交换位置,因为倒数第三个本身已是最大的,所以实际无需交换.
163 | 161 | 158 | 163 | 162 | 159 | 165 | 170 | 171 |
重复以上步骤,直到最后只剩下一人,此时所有人均已按照从低到高顺序排列
158 | 159 | 161 | 162 | 163 | 163 | 165 | 170 | 171 |
动图演示(来源 runoob.com):
代码实现:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void swap(int *num1,int *num2) //交换两个变量的值 5 { 6 int temp = *num1; 7 *num1 = *num2; 8 *num2 = temp; 9 } 10 11 void SelectSort1(int arr[], int len) 12 { 13 for( int i=0; i<len-1; i++) 14 { 15 int max = 0; 16 for(int j=1; j<len-i; j++) 17 { //查找未排序的元素 18 if(arr[j]>arr[max]) 19 {//找到目前最小值 20 max = j; 21 } 22 } 23 24 //printf("max: %d beauties %d\n", max,len-i-1); 25 if(max != (len-i-1)) 26 { 27 swap(&arr[max], &arr[len-i-1]); 28 } 29 } 30 } 31 32 void SelectSort2(int arr[], int len) 33 { 34 int i,j; 35 for (i = 0 ; i < len - 1 ; i++) 36 { 37 int min = i; 38 for (j = i + 1; j < len; j++) 39 { 40 //查找未排序的元素 41 if (arr[j] < arr[min]) 42 { //找到目前最小值 43 min = j; //记录最小值 44 } 45 } 46 47 swap(&arr[min], &arr[i]); //交换 48 } 49 } 50 51 int main(void) 52 { 53 int beauties[]={163, 161, 158, 165, 171, 170, 163, 159, 162}; 54 int len = sizeof(beauties)/sizeof(beauties[0]); 55 /*for( int i=0; i<len-1; i++) 56 { 57 int max = 0; 58 for(int j=1; j<len-i; j++) 59 { 60 if(beauties[j]>beauties[max]) 61 { 62 max = j; 63 } 64 } 65 printf("max: %d beauties %d\n", max,len-i-1); 66 if(max != (len-i-1)) 67 { 68 swap(&beauties[max], &beauties[len-i-1]); 69 } 70 } 71 */ 72 SelectSort2(beauties, len); 73 74 for(int i=0; i<len; i++) 75 { 76 printf("%d ", beauties[i]); 77 } 78 79 system("pause"); 80 }
====================================================================================================================