基本思想:
在待排记录中依次选择关键字最小的记录作为有序序列的最后一条记录,逐渐缩小范围,直至全部记录选择完毕。
排序过程:
①首先扫描整个待排列序列,通过 n-1 次比较,找到关键词值最小的结点,将它与第一个记录交换
②再通过 n-2 次比较,从剩余的 n-1 次记录中找出关键字次小的记录,将它与第二个记录交换
③重复上述操作,共进行 n-1 趟排序后,排序结束
优点:
一趟扫描结束后最多只有一次结点交换
缺点:
每趟只能确定一个元素,表长为 n 时需要 n-1 趟
要点:
①是不稳定排序
②当一个记录占用的空间较多时,此方法比直接插入排序快
③可用于链式存储结构
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 5 void print_arr(int arr[], int arrlen) { 6 for (int i = 0; i < arrlen; i++) { 7 printf("%d ", arr[i]); 8 } 9 printf(" "); 10 } 11 12 void simple_choose_sort(int arr[],int arrlen) { 13 for (int i = 0; i < arrlen-1; i++) { //i:0~arrlen-2 14 int min = i; 15 for (int j = i + 1; j < arrlen; j++) { //j:i+1~arrlen-1 16 if (arr[min] > arr[j]) { //前面比后面大,min赋给后面 17 min = j; 18 } 19 } 20 if (min != i) { //交换arr[i]arr[i]后面序列中的最小值 21 int temp = arr[min]; 22 arr[min] = arr[i]; 23 arr[i] = temp; 24 } 25 printf("第%d次排序: ",i+1); 26 print_arr(arr, arrlen); 27 } 28 } 29 void main() { 30 int arr[] = { 19,25,17,41,28,14,23,16 }; 31 printf("原始序列: "); 32 print_arr(arr, 8); 33 simple_choose_sort(arr, 8); 34 }