• 选择排序


    选择排序,包括“直接选择排序”和“堆排序”。

     上次我们对比了冒泡排序和快速排序。由于算法不一样,效率也完全不一样。可以快排有他得天独厚的优势。

    今天我们再来看一下直接选择排序,让他跟堆排序进行一次VS ,也让我们也感受一下他们的优劣。

    1.直接选择排序: 

    先上图:

    说实话,直接选择排序最类似于人的本能思想,比如把大小不一的玩具让三岁小毛孩对大小排个序,

    那小孩首先会在这么多玩具中找到最小的放在第一位,然后找到次小的放在第二位,以此类推。。。。。。

    小孩子多聪明啊,这么小就知道了直接选择排序。

    对的,小孩子给我们上了一课,

    第一步: 我们拿80作为参照物(base),在80后面找到一个最小数20,然后将80跟20交换。

    第二步:  第一位数已经是最小数字了,然后我们推进一步在30后面找一位最小数,发现自己最小,不用交换。

    第三步:........

    最后我们排序完毕。大功告成。

    C++ 源程序:

     1 #include<iostream>
     2 #include <ctime>  //使用了time() 函数 
     3 #include <cstdlib>    //使用了srand()函数 
     4 
     5 const int N=2000005;
     6 int a[N];
     7 using namespace std;
     8 
     9 //选择排序
    10         void SelectionSort(int *a,int n)
    11         {
    12             //要遍历的次数
    13             for (int i = 1; i < n; i++)
    14             {
    15                 //假设tempIndex的下标的值最小
    16                 int tempIndex = i;
    17 
    18                 for (int j = i + 1; j <= n; j++)
    19                 {
    20                     //如果tempIndex下标的值大于j下标的值,则记录较小值下标j
    21                     if (a[tempIndex] > a[j])
    22                         tempIndex = j;
    23                 }
    24 
    25                 //最后将假想最小值跟真的最小值进行交换
    26                 int  tempData = a[tempIndex];
    27                 a[tempIndex] = a[i];
    28                 a[i] = tempData;
    29             }
    30             return ;
    31         }                 
    32 
    33 int main()
    34 {
    35     //随机产生n个数存入数组a中 
    36     int n=21000;
    37     srand(int(time(0)));      //利用时间函数time(),产生每次不同的随机数种子
    38     for(int i=1;i<=n;i++) a[i]=rand();  //随机产生3000个数存于数组a中 (从1开始) 
    39     clock_t start = clock();
    40     SelectionSort(a,n);                   //对数组a进行排序(从1开始) 
    41     clock_t end = clock();
    42     for(int i=1;i<=20;i++) cout<<a[i]<<' ';    //输出前20个数据(已从小到大排序) 
    43     cout<<endl<<"选择排序耗时为:"<<end-start<<"ms"<<endl; 
    44     return 0;
    45 }

            经我亲测在1秒中之内,可排序的数据为21000个,原因为选择排序的时间复杂度为O(n2),因此只能排21000个数据,要想排序次数超过万级,就必须更换成新的排序方法。发现选择排序略比冒泡快一点点,时间复杂度为一样,为何,比较次数是一样的,但移动的次数却少了。见程序。故快一点点,实际中这一点点是可忽略的。还是采用其他方法,才能解决十万百万级。

  • 相关阅读:
    Azkaban 简介(一)
    大数据平台搭建(Ambari +HDP)
    大数据平台比较-CDH、HDP、CDP
    Kylin 操作使用(六)
    Kylin 安装部署(五)
    Kylin 核心概念(四)
    数据流图
    android:sharedUserId
    Android的uid与UserHandle
    C++ 多态
  • 原文地址:https://www.cnblogs.com/jjzzx/p/5071316.html
Copyright © 2020-2023  润新知