# 选择排序
##本小节知识点:
1. 【了解】选择排序
2. 【掌握】选择排序的基本思想
3. 【了解】练习
---
##1.选择排序
- 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元 素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
---
##2.选择排序的基本思想
- 第一趟排序在所有待排序的n个记录中选出关键字最小的记录,将它与数据表中的第一个记录交换位置,使关键字最小的记录处于数据表的最前端;第二趟在剩下的n-1个记录中再选出关键字最 小的记录,将其与数据表中的第二个记录交换位置,使关键字次小的记录处于数据表的第二个位置;重复这样的操作,依次选出数据表中关键字第三小、第四小...的元素,将它们分别换到数据表的第三、第四...个位置上。排序共进行n-1趟,最终可实现数据表的升序排列。
- 示例
---
##3.练习
- 输入一组无序数据,使用选择排序法进行排序,并输出。
---
1 // main.c 2 // 选择排序 3 4 #include <stdio.h> 5 //交换算法 6 //打印输出数组的功能 7 void printArray(int array[],int length) 8 { 9 for (int i=0; i<length; i++) { 10 printf("%d ",array[i]); 11 } 12 printf(" "); 13 } 14 15 //为了能够交换功能模块化,需要使用传地址来改变函数外的值 16 //要注意的是,参数需要传入地址值,也就是通过&获取变量的地址 17 void swop(int *a,int *b) 18 { 19 int temp = *a; 20 *a = *b; 21 *b = temp; 22 } 23 24 void selectSort(int r[],int n) 25 { 26 printf(" "); 27 int min; 28 for (int i=0; i<n-1; i++) { 29 min = i; 30 // printf("当i = %d的时候开始比较。",i); 31 for (int j=i+1; j<n; j++) { 32 // printf("比较前:最小的:%d和待比较的%d ",r[min],r[j]); 33 // printArray(r,4); 34 if (r[j] < r[min]) { 35 // printf("要替换了,"); 36 min = j;//内循环一遍历到小值,就将该索引值赋值给min 37 }//紧接着就继续查找最小值,然后获得其索引 38 } 39 //找到最小值后,判断索引和之前的索引是否相同,不同就替换 40 if (min != i) { 41 swop(&r[min], &r[i]); 42 } 43 } 44 } 45 46 int main(int argc, const char * argv[]) { 47 48 int a[5] = {23,45,12,13,18}; 49 selectSort(a,5); 50 printArray(a,5); 51 return 0; 52 }
选择排序的思路很简单,分两步:1、查找最小的。2、第几次查找就和第几个替换。第一次查找就和第一个数替换
1、查找思路:标记法(通过min变量存储索引值),开始标记第一个数,然后跟第二个开始比较,哪个小就取其索引值标记,标记好后,
接着跟下一个数比较,哪个小就取其索引值标记,循环复始。直到比较到最后一个数。<这里就是第n次内循环>
2、<完成第n次内循环之后>就把min索引指向的数组值和数组第n个值替换。
(补充)
3、循环初始条件和结束条件怎么取?
每次内循环最开始都是是第i个和第i+1个比较,所以外循环初始条件i=1,内循环初始条件j=i+1,
因为最后是第n-1个和第n个比较,所以结束条件外循环i<n-1,内循环j<n。