zoukankan      html  css  js  c++  java
  • 5、【排序算法】选择排序

    一、选择排序介绍

    选择排序(Selection sort)是一种简单直观的排序算法。
    它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

    二、选择排序的时间复杂度和稳定性

    选择排序时间复杂度
    选择排序的时间复杂度是O(N2)。
    假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1!因此,选择排序的时间复杂度是O(N2)。

    选择排序稳定性
    选择排序是稳定的算法,它满足稳定算法的定义。
    算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

    三、选择排序的C++实现

    main.cpp

     1 /**
     2  * 选择排序:C++
     3  *
     4  * @author skywang
     5  * @date 2014/03/11
     6  */
     7 
     8 #include <iostream>
     9 using namespace std;
    10 
    11 /*
    12  * 选择排序
    13  *
    14  * 参数说明:
    15  *     a -- 待排序的数组
    16  *     n -- 数组的长度
    17  */
    18 void selectSort(int* a, int n)
    19 {
    20     int i;        // 有序区的末尾位置
    21     int j;        // 无序区的起始位置
    22     int min;    // 无序区中最小元素位置
    23 
    24     for(i=0; i<n; i++)
    25     {
    26         min=i;
    27 
    28         // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
    29         for(j=i+1; j<n; j++)
    30         {
    31             if(a[j] < a[min])
    32                 min=j;
    33         }
    34 
    35         // 若min!=i,则交换 a[i] 和 a[min]。
    36         // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
    37         if(min != i)
    38         {
    39             int tmp = a[i];
    40             a[i] = a[min];
    41             a[min] = tmp;
    42         }
    43     }
    44 }
    45 
    46 int main()
    47 {
    48     int i;
    49     int a[] = {20,40,30,10,60,50};
    50     int ilen = (sizeof(a)) / (sizeof(a[0]));
    51 
    52     cout << "before sort:";
    53     for (i=0; i<ilen; i++)
    54         cout << a[i] << " ";
    55     cout << endl;
    56 
    57     selectSort(a, ilen);
    58 
    59     cout << "after  sort:";
    60     for (i=0; i<ilen; i++)
    61         cout << a[i] << " ";
    62     cout << endl;
    63 
    64     return 0;
    65 }
  • 相关阅读:
    阿里图标库引用简介---20200608更新
    2.10排序算法
    2.9Node节点的学习
    2.8DOM节点的学习
    2.5数组
    2.6对象和函数
    2.7变量、内存、Math和Date的初级认识
    css优先级问题
    事件委托(事件代理)初认识
    静态页面学习随笔(1)-如何正确布局大体结构
  • 原文地址:https://www.cnblogs.com/Long-w/p/9779640.html
Copyright © 2011-2022 走看看