亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++ 基數排序的實現實例代碼

2020-05-23 13:59:30
字體:
來源:轉載
供稿:網友

C++ 基數排序

 大家好,今天帶來的是自己實現的用C++完成基數排序.在數據結構,算法分析和程序設計的學習過程中,我們經常也無法避免的要學到排序的算法.排序算法是程序設計過程中使用頻率極高的算法之一,其輸入是一組無序的序列,要求以升序或者降序的方式輸出一組有序的序列.對于如二分查找等算法,要求輸入是有序的序列,也就是要先排序后查找,由此可見排序算法的重要性.

  廣為人知的排序算法有冒泡排序,還有選擇排序,插入排序.高級一些的有快速排序,希爾排序,堆排序,歸并排序,基數排序等. 其中時間復雜度為O(n*logn)的算法有快速排序,歸并排序和堆排序等,其中快速排序的使用最為廣泛.時間復雜度為O(n2)的算法有冒泡排序,選擇排序和插入排序等.

  基數排序是一種非比較的排序算法,它是以桶排序為基礎的.它們在現代計算機出現之前,一直被用于老式穿孔卡的排序.

  基數排序的基本思想是:一共有10個"桶",代表各個數位為0~9.在每個桶上,組織一個優先隊列,對于輸入的一系列正整數和0,按照個位的大小關系分別進入10個"桶"中.然后遍歷每個"桶",按照十位的大小關系進行調整,緊接著是百位,千位.......直到到達最大數的最大位數.結合圖例,我們可以理解這個算法:

C++,基數排序,基數排序詳解及實例,基數排序實現代碼

  在C++實現中,我用到了隊列這一數據結構作為每個"桶"的組織方式,因為取數總是從最下方取,而放入數這是放入"桶"的頂部,這與隊列的隊頭出對,隊尾入隊的方式相似.對10個"桶"的組織,則采用向量vector.這個程序支持,輸入序列一定范圍內不限個數,且在int數據類型表示范圍內的非負數排序,根據最大數的位數來決定排序趟數.將數據類型從int改為long或者long long ,則可對更大的整數排序.

  排序函數如下:

 1 vector<int> radix_sort(vector<int> in) 2 { 3   vector<queue<int>> bucket(10);      //十個桶為一個向量,每個桶又是一個隊列 4   int max_value = in.at(0); 5  6   for (auto &i : in) 7   { 8     if ( i > max_value) 9       max_value = i; 10   }                               //找出輸入的最大元素 11  12   int n = 0; 13  14   for (; max_value != 0; max_value /= 10, ++n) 15     ;                             //得到最多位數,也即排序趟數 16  17   for (auto &i : in) 18     bucket.at(0).push(i);               //全部放入第一個桶 19  20   int i = 0;                         //趟數控制變量 21   int m = 0;                        //提取各個位數有關的控制變量 22   int k = 0;                         //桶數控制變量 23   int x = 0;                         //桶的大小,因動態改變了容器,迭代器會失效,不使用迭代器 24   int y = 0;                         //桶內部控制變量 25   int j = 0;                          26   int item = 0;                        //桶內元素 27  28   for (; i < n ; ++i)                    //趟數循環 29   { 30     for ( k = 0; k < 10 ; ++k)    //遍歷每個桶 31     { 32       x = bucket.at(k).size(); 33  34       if ( !x ) 35         continue; 36  37       for (y = 0; y < x ; ++y)                 //遍歷桶中隊列的元素 38       { 39         item = j = bucket.at(k).front(); 40  41         for (m = i; m > 0; --m)               //提取出各個位 42           j /= 10; 43  44         switch (j % 10)                   //進入相應的桶 45         { 46           case 0: 47             bucket.at(0).push(item); 48             break; 49  50           case 1: 51             bucket.at(1).push(item); 52             break; 53  54           case 2: 55             bucket.at(2).push(item); 56             break; 57  58           case 3: 59             bucket.at(3).push(item); 60             break; 61  62           case 4: 63             bucket.at(4).push(item); 64             break; 65  66           case 5: 67             bucket.at(5).push(item); 68             break; 69  70           case 6: 71             bucket.at(6).push(item); 72             break; 73  74           case 7: 75             bucket.at(7).push(item); 76             break; 77  78           case 8: 79             bucket.at(8).push(item); 80             break; 81  82           case 9: 83             bucket.at(9).push(item); 84             break; 85  86           default:                     //異常檢測,捕捉與處理 87             try 88             { 89               throw runtime_error("Error!"); 90             } 91             catch (runtime_error err) 92             { 93               cout << err.what() << endl; 94               exit(EXIT_FAILURE); 95             } 96         } 97  98         bucket.at(k).pop(); 99       }100     }101   }102 103   vector<int> out;                        //定義一個新的向量,將所有桶的數據收集起來作為最后結果104 105   for ( i = 0; i < 10; ++i )106   {107     int num = bucket.at(i).size();108 109     for (int ai = 0; ai < num; ++ai)110     {111       out.push_back( bucket.at(i).front() );112       bucket.at(i).pop();113     }114   }                                            //排序結果到一個向量中115 116   return out;                         //返回這個有序的序列117 118 }

    算法要得到正確結果,要注意的是同一個桶的元素的順序,是從下至上遞增的,這是由遍歷時從代表0的"桶"開始和從桶中取     元素時是從下取保證的.再有,最后從桶中取出元素時也要注意順序.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91社区国产高清| 亚洲а∨天堂久久精品9966| 国产在线视频91| 亚洲精品www久久久久久广东| 亚洲国产小视频在线观看| 久久久久久久一区二区三区| 久久99视频精品| 日本精品视频在线| 91九色单男在线观看| 亚洲成avwww人| 日本精品一区二区三区在线| 福利一区视频在线观看| 一区二区成人精品| 97视频免费观看| 亚洲激情成人网| 久久韩剧网电视剧| 国产不卡精品视男人的天堂| 社区色欧美激情 | 亚洲国产精品热久久| 91精品久久久久久久久中文字幕| 久久久久久综合网天天| 国产精品一久久香蕉国产线看观看| 欧美日韩高清在线观看| 日韩欧美中文免费| 国产丝袜一区二区三区| 日韩精品视频在线| 欧美高跟鞋交xxxxhd| 亚洲国产精品嫩草影院久久| 久久99久久亚洲国产| 国产噜噜噜噜久久久久久久久| 欧美专区第一页| 一个人看的www欧美| 成人美女免费网站视频| 亚洲精品白浆高清久久久久久| 欧美性高潮在线| 国内成人精品一区| 成人精品久久av网站| 国产精品一区二区三区在线播放| 亚洲人成网站色ww在线| 久久视频在线直播| 亚洲天堂精品在线| 欧美日韩国产91| 亚洲欧美日韩国产成人| 亚洲香蕉伊综合在人在线视看| 亚洲视频视频在线| www.精品av.com| 欧美怡春院一区二区三区| 国产精品综合网站| 欧美性生交xxxxx久久久| 日韩美女免费观看| 国产91精品视频在线观看| 中国人与牲禽动交精品| 91av视频在线观看| 免费91麻豆精品国产自产在线观看| 欧美黄色小视频| 国产精品久久久久久久久粉嫩av| 亚洲新声在线观看| 亚洲欧洲在线免费| 狠狠久久五月精品中文字幕| 亚洲综合在线中文字幕| 亚洲大胆人体视频| 中文字幕欧美专区| 欧美成人手机在线| 欧美性xxxx极品hd欧美风情| 91九色国产在线| 久久久久久久久久久av| 国产精品免费一区二区三区都可以| 欧美日本亚洲视频| 国产日韩欧美视频| 91亚洲va在线va天堂va国| 精品国产拍在线观看| 在线观看欧美www| 另类专区欧美制服同性| 26uuu日韩精品一区二区| 久久久人成影片一区二区三区| 国产精品久久久久影院日本| 69久久夜色精品国产69乱青草| 91色精品视频在线| 国产成人一区三区| 久久精品91久久久久久再现| 日韩成人网免费视频| 亚洲美女中文字幕| 欧美激情视频播放| 亚洲社区在线观看| 亚洲黄色av网站| 久久99久国产精品黄毛片入口| 亚洲二区在线播放视频| 最近中文字幕mv在线一区二区三区四区| 日本高清+成人网在线观看| 日韩中文字幕网站| 午夜精品久久久久久久99热浪潮| 国产精品91视频| 欧美超级免费视 在线| 91视频九色网站| 欧美成人黄色小视频| 国产精品久久视频| 国产视频亚洲视频| 欧美夜福利tv在线| 亚洲精品视频网上网址在线观看| 日韩精品中文字幕在线播放| 狠狠躁天天躁日日躁欧美| 欧美午夜精品久久久久久浪潮| 2020久久国产精品| 俺去了亚洲欧美日韩| 久久国产精品影视| 欧美激情视频一区二区三区不卡| 欧美成人在线网站| 亚洲欧美日本精品| 国产精品毛片a∨一区二区三区|国| 国产成人精品视频| 国产一区二中文字幕在线看| 久久91亚洲精品中文字幕奶水| 国产精品一区二区女厕厕| 亚洲精品乱码久久久久久金桔影视| 日本高清不卡的在线| 国产亚洲欧美视频| 久久免费少妇高潮久久精品99| 国产性猛交xxxx免费看久久| 91免费视频网站| 国产精品久久久久久av福利| 成人国产精品一区| 色中色综合影院手机版在线观看| 久久精品亚洲一区| 国产精品丝袜一区二区三区| 亚洲精选一区二区| 亚洲韩国欧洲国产日产av| 日韩美女中文字幕| 色黄久久久久久| 亚洲精品网站在线播放gif| 亚洲精品日韩av| 国产精品自产拍高潮在线观看| 久久这里只有精品视频首页| 欧美日韩在线一区| 亚洲性生活视频在线观看| 91精品国产高清久久久久久91| 亚洲午夜久久久久久久| www.国产精品一二区| 日韩电影免费观看在线| 国产精品第一第二| 欧美精品一本久久男人的天堂| 一区二区三区四区在线观看视频| 日本成人在线视频网址| 欧美网站在线观看| 日本午夜人人精品| 欧美色道久久88综合亚洲精品| 国产精品欧美在线| 亚洲成年人在线播放| 久久久999精品免费| 亚洲自拍偷拍色片视频| 亚洲欧美日韩精品久久| 精品高清美女精品国产区| 国产精品久久久久9999| 色老头一区二区三区在线观看| 欧美一级淫片丝袜脚交| 中文字幕精品久久| 亚洲国产美女精品久久久久∴| 超碰精品一区二区三区乱码| 久久精品中文字幕免费mv| 综合久久五月天| 中文字幕9999| 中文字幕日韩欧美精品在线观看| 亚洲欧美成人网| 亚洲free嫩bbb| 精品一区电影国产|