C语言练习之 选择排序

Posted xuelanga000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言练习之 选择排序相关的知识,希望对你有一定的参考价值。

摘要:选择排序在C语言中也有着广泛的应用,笔者在学习别人单片机代码的过程中经常看到许多经验丰富的老程序员

采用选择排序,因此,笔者也记录下来了选择排序。

目录

  1.选择排序思想

  2.选择排序示意图

  3.算法时间复杂度和稳定性

  4.示例代码

  5.vs2015运行示意图

一、选择排序思想

  选择排序是一种直观的排序思想,简单来说,就是从未排序的数列中找出最小的元素,放在起始地址,接下来在从未排序的数列中选择次小的元素放在第二位置,

接下来,以此类推。

  注:笔者是从小到大的顺序进行说明的。

二、选择排序示意图

  转载自博友skywang12345:https://www.cnblogs.com/skywang12345/p/3597641.html

  下面以数列20,40,30,10,60,50为例,演示它的选择排序过程(如下图)。

  技术图片

  

排序流程

第1趟:i=0。找出a[1...5]中的最小值a[3]=10,然后将a[0]和a[3]互换。 数列变化:20,40,30,10,60,50 -- > 10,40,30,20,60,50
第2趟:i=1。找出a[2...5]中的最小值a[3]=20,然后将a[1]和a[3]互换。 数列变化:10,40,30,20,60,50 -- > 10,20,30,40,60,50
第3趟:i=2。找出a[3...5]中的最小值,由于该最小值大于a[2],该趟不做任何处理。 
第4趟:i=3。找出a[4...5]中的最小值,由于该最小值大于a[3],该趟不做任何处理。 
第5趟:i=4。交换a[4]和a[5]的数据。 数列变化:10,20,30,40,60,50 -- > 10,20,30,40,50,60

三、算法时间复杂度和稳定性

♦算法时间复杂度:数列中有N个数需要排序,而选择排序是一个二重循环,根据算法的时间复杂度公式Ο(N)=O(m)×O(n),因此,选择排序的时间复杂度是O(N2)。

♦算法稳定性:在待排序的数据中,存在多个相同的数据,经过排序之后,他们的对相对顺序依旧保持不变,实际上就是说array[i]=array[j],i<j.就是array[i]在array[j]之前,那么经过排序之后array[i]依旧在array[j]之前,那么这个排序算法稳定,否则,这个排序算法不稳定

根据上述算法稳定性的定义,选择排序其实属于不稳定的排序算法,反例如下:

有如下序列5 8 5 2 9, 这个在执行选择排序的时候,第一遍,肯定会将array[0]=5,交换到2所在的位置,也就是 2 8 5 5 9,那么很显然,之后的排序我们就会发现,array[2]中的5会出现在原先的array[0]之前,所以选择排序不是一个稳定的排序。

笔者,找到了一些关于算法稳定性的总结如图3-1所示:

技术图片

                    3-1 算法稳定性分析

四、示例代码

技术图片
 1 #include <string>
 2 #include<iostream>
 3 
 4 #define SWAP(X,Y) X=X+Y;Y=X-Y;X=X-Y
 5 
 6 #define ARRSIZE(arr)   (sizeof(arr)/sizeof(arr[0]))
 7 
 8 using namespace std;
 9 
10 void selsort(int a[],int len); //选择排序
11 void print(int a[], int len);
12 
13 
14 int main(int argc, char *argv) 
15 
16     int a[] =  526,36,2,369,56,45,78,92,125,52 ;
17     int length = ARRSIZE(a);
18     printf("before sort:\\n");
19     print(a, length);
20     selsort(a, length);
21     printf("after sort:\\n");
22     print(a, length);
23     return 0;
24     
25 
26 
27 /*
28 **实现数据从小到大的排列
29 */
30 void selsort(int a[], int len) 
31     int min;
32     for (int i = 0; i < len - 1; i++) 
33 
34         min = i;
35         for (int j = i + 1; j < len ; j++) 
36 
37             if (a[j] < a[min]) 
38                 min = j;
39             
40         
41 
42         if (min != i) 
43             SWAP(a[i], a[min]);
44         
45     
46 
47 
48 
49 
50 void print(int a[], int len) 
51     for (int i = 0; i < len; i++) 
52         printf("a[%d]=%d ", i, a[i]);
53     
54     printf("\\n");
55 
View Code

 

五、vs2015运行示意图

技术图片

 

 

以上是关于C语言练习之 选择排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法练习之选择排序

C语言 | 选择排序

C语言 | 选择法排序

C#官方文档阅读笔记--C#语言和.NET简介

C语言 | 希尔排序

python进阶练习之——三数排序❤️