排序算法--简单选择排序

# 选择排序
##本小节知识点:
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。

 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/goodboy-heyang/p/4892914.html