• 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:
    ");
    19     print(a, length);
    20     selsort(a, length);
    21     printf("after sort:
    ");
    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("
    ");
    55 }
    View Code

    五、vs2015运行示意图

     

  • 相关阅读:
    Asp.net Treeview 客户端选中效果实现 (初级)
    MYSQL生成日历表,通常在做报表的时候需要用来生成一个临时表,用来左连接等。
    写了一个抽奖类,感觉还不错,可以适合各种变化
    将系统的内部类:HttpValueCollection 移到自己的系统中,使其能方便的解析id=1&name=张三&sex=男这样的字符串参数 querystring
    指定某个文件的创建 修改 访问时间
    Reqeust["keyname"] 的读取顺序
    pku1463 Strategic game
    pku1947 Rebuilding Roads
    pku1848 Tree
    pku1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/xuelanga000/p/11384412.html
Copyright © 2020-2023  润新知