不同長度數據項的排序

注:本文改編自windmissing博客,感謝作者整理!

?

題目:

a)給定一個整數數組,其中不同的整數中包含的數字個數可能不同,但是該數組中,所有整數中總的數字數為n。說明如何在O(n)時間內對該數組進行排序

b)給定一個字符串數組,其中不同的串包含的字符個數可能不同,但所有串中總的字符個數為n。說明如何在O(n)時間內對該數組進行排序

(注意此處的順序是指標準的字母順序,例如,a < ab < b)

?

a)先用桶排序方法按數字位數排序O(n),再用基數排序的方法分別對每個桶中的元素排序O(n)
b)遞歸使用計數排序,先依據第一個字母進行排序,首字相同的放在同一組,再對每一組分別使用計數排序的方法比較第二個字母
見到有人用字典樹,也是可以的
  1 //8-2-a
  2 #include <iostream>
  3 #include <cmath>
  4 using namespace std;
  5 
  6 int length_A;
  7 void Print(int *A)
  8 {
  9   int i;
 10   for(i = 1; i <= length_A; i++)
 11       cout<<A[i]<<' ';
 12   cout<<endl;
 13 }
 14 
 15 int Digit(int x)
 16 {
 17   int ret = 0;
 18   while(x)
 19   {
 20      ret++;
 21      x = x / 10;
 22   }
 23 
 24   return ret;
 25 }
 26 
 27 
 28 //基數排序調用的穩定排序
 29 void Counting_Sort(int *A, int *B, int k)
 30 {
 31     int i, j;
 32     //將C數組初始化為0,用于計數
 33     int *C = new int[k+1];
 34     for(i = 0; i <= k; i++)
 35         C[i] = 0;
 36     int *D = new int[length_A+1];
 37     for(j = 1; j <= length_A; j++)
 38     {
 39         //D[j]表示第[j]個元素有i位數字
 40         D[j] = Digit(A[j]);
 41         //C[j]表示數字D[j]在數組A中出現的次數
 42         C[D[j]]++;
 43     }
 44     //C[i]表示所以<=i的數字出現過的次數
 45     for(i = 1; i <= k; i++)
 46         C[i] = C[i] + C[i-1];
 47     //初始化B為0,B用于輸出排序結果
 48     for(i = 1; i <= length_A; i++)
 49         B[i] = 0;
 50     for(j = length_A; j >= 1; j--)
 51     {
 52         //如果<=D[j]的數字的個數是x,那么排序后A[j]應該出現在第x個位置,即B[x]=A[j]
 53         B[C[D[j]]] = A[j];
 54         C[D[j]]--;
 55     }
 56     delete []C;
 57     delete []D;
 58 }
 59 //基數排序調用的穩定排序
 60 void Stable_Sort(int *A, int *B, int k, int d,int start, int end)
 61 {
 62     int i, j, radix = 10;
 63     //將C數組初始化為0,用于計數
 64     int *C = new int[k+1];
 65     for(i = 0; i <= k; i++)
 66         C[i] = 0;
 67     int *D = new int[length_A+1];
 68     for(j = start; j <= end; j++)
 69     {
 70         //D[j]表示第[j]個元素的第i位數字
 71         D[j] = A[j] % (int)pow(radix*1.0, d) / (int)pow(radix*1.0, d-1);
 72         //C[j]表示數字D[j]在數組A中出現的次數
 73         C[D[j]]++;
 74     }
 75     //C[i]表示所以<=i的數字出現過的次數
 76     for(i = 1; i <= k; i++)
 77         C[i] = C[i] + C[i-1];
 78     //初始化B為0,B用于輸出排序結果
 79     for(i = 1; i <= length_A; i++)
 80         B[i] = 0;
 81     for(j = end; j >= start; j--)
 82     {
 83         //如果<=D[j]的數字的個數是x,那么排序后A[j]應該出現在第x個位置,即B[x]=A[j]
 84         B[C[D[j]]+start-1] = A[j];
 85         C[D[j]]--;
 86     }
 87     delete []C;
 88     delete []D;
 89 }
 90 void Radix_Sort(int *A, int *B, int k ,int digit, int start, int end)
 91 {
 92     int i, j;
 93     //依次對每一位進行排序,從低位到高位
 94     for(i = 1; i <= digit; i++)
 95     {
 96         Stable_Sort(A, B, k, i, start, end);
 97         //輸入的是A,輸出的是B,再次排序時要把輸出數據放入輸出數據中
 98         for(j = start; j <= end; j++)
 99         A[j] = B[j];
100     }
101 }
102 int main()
103 {
104     cin>>length_A;
105     int i;
106     //產生隨機的測試數據
107     int *A = new int[length_A+1];
108     for(i = 1; i <= length_A; i++)
109         A[i] = rand() % (int)pow(10.0, rand()%5+1);
110     Print(A);
111     int *B = new int[length_A+1];
112     //先進行計數排序,把長度相同的數字排在一起
113     Counting_Sort(A, B, 5);
114     for(i = 1; i <= length_A; i++)
115         A[i] = B[i];
116     Print(A);
117     int start, end, digit = -1;
118     for(i = 1; i <= length_A; i++)
119     {
120         if(digit == -1)
121         {
122             digit = Digit(A[i]);
123             start = i;
124             end = i;
125         }
126         else
127         {
128             if(Digit(A[i]) == digit)
129                 end = i;
130             else
131             {
132                 //找到位數相同的一段,從start到end,單獨對這一段進行基數排序
133                 Radix_Sort(A, B, 9, digit, start, end);
134                 i--;
135                 digit = -1;
136                 Print(A);
137             }
138         }
139     }
140     delete []A;
141     delete []B;
142 }
  1 #include <iostream>
  2 #include <string>
  3 using namespace std;
  4 
  5 int length_A;
  6 void Print(string *A)
  7 {
  8     int i;
  9     for(i = 1; i <= length_A; i++)
 10         cout<<A[i]<<' ';
 11     cout<<endl;
 12 }
 13 //基數排序調用的穩定排序,A是輸入,B是中間輸出,C是計數,d表示對第d位字母排序,start和end分別是排序段的起點和終點
 14 void Counting_Sort(string *A, string *B, int *C, int d, int start, int end)
 15 {
 16     if(start == end)
 17         return;
 18     int i, j;
 19     //將C數組初始化為0,用于計數
 20     for(i = 0; i <= 26; i++)
 21         C[i] = 0;
 22     int *D = new int[length_A+1];
 23     for(j = start; j <= end; j++)
 24     {
 25         //D[j]表示第[j]個元素的第i位數字
 26         if(A[j].length() <= d)
 27             D[j] = 0;
 28         else
 29             D[j] = A[j][d] - 'a';
 30         //C[j]表示數字D[j]在數組A中出現的次數
 31         C[D[j]]++;
 32     }
 33     //C[i]表示所以<=i的數字出現過的次數
 34     for(i = 1; i <= 26; i++)
 35         C[i] = C[i] + C[i-1];
 36     //初始化B為0,B用于輸出排序結果
 37     for(i = 1; i <= length_A; i++)
 38         B[i] = "";
 39     for(j = end; j >= start; j--)
 40     {
 41         //如果<=D[j]的數字的個數是x,那么排序后A[j]應該出現在第x個位置,即B[x]=A[j]
 42         B[C[D[j]]+start-1] = A[j];
 43         C[D[j]]--;
 44     }
 45     delete []D;
 46     //輸出轉為輸入
 47     for(i = start; i <= end; i++)
 48         A[i] = B[i];
 49     char c = 'A';
 50     int s, e;//進一步的排序以s為起點,e為終點
 51     //對于排序的這一段,對下一個字母遞歸使用計數排序
 52     for(i = start; i <= end; i++)
 53     {
 54         //如果長度為d,不參與下一步排序
 55         if(A[i][d] == '\0')
 56             continue;
 57         if(c == 'A')
 58         {
 59             s = i;
 60             e = i;
 61             c = A[i][d];
 62         }
 63         else
 64         {
 65             if(A[i][d] == c)
 66             {
 67                 e = i;
 68                 if(e == end)
 69                     //以第d+1位字母為依據,對s-e段進行計數排序
 70                     Counting_Sort(A, B, C, d+1, s, e);
 71             }
 72             else
 73             {
 74                 //以第d+1位字母為依據,對s-e段進行計數排序
 75                 Counting_Sort(A, B, C, d+1, s, e);
 76                 i--;
 77                 c = 'A';
 78             }
 79         }
 80     }
 81 }
 82 int main()
 83 {
 84     int i, j;
 85     cin>>length_A;
 86     string *A = new string[length_A+1];
 87     //構造隨機數據
 88     for(i = 1; i <= length_A; i++)
 89     {
 90         int len = rand()%5+1;
 91         for(j = 1; j <= len; j++)
 92             A[i] = A[i] + (char)(rand()%26+'a');
 93     }
 94     Print(A);
 95     string *B = new string[length_A+1];
 96     int *C = new int[26];
 97     //計數排序
 98     Counting_Sort(A, B, C, 0, 1, length_A);
 99     Print(A);
100     delete []A;
101     delete []C;
102     return 0;
103 }

?

轉載于:https://www.cnblogs.com/lixiaohui-ambition/archive/2012/09/20/2695802.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274597.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274597.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談前端埋點監控

大家好&#xff0c;我是若川。持續組織了近一年的源碼共讀活動&#xff0c;感興趣的可以 加我微信lxchuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外&…

css版式_第2部分:使版式具有響應能力,并為以后的版本奠定基礎

css版式The feedback I’ve received over the past week has been amazing, and matches my own excitement about this project. I’ve spent a lot of time researching, writing, and teaching about creating better typography for reading on digital devices over the …

BBS項目--登錄

BBS階段性測試總要求 django登錄報錯 Error: [WinError 10013] 以一種訪問權限不允許的方式做了一個訪問套接字的嘗試。 原因分析&#xff1a;出現這種情況在Windows中很常見&#xff0c;就是端口被占用 解決措施&#xff1a;這時我們只需改一下端口便可以了 登錄前端頁面(HTML…

【聲明】

我的公眾號和朋友圈有時會有一些課程推廣廣告&#xff0c;微博的收入來源。我接的廣告一般來說都是比自己去買會優惠不少&#xff0c;我也會想方設法爭取到更多福利&#xff08;優惠&#xff09;。買過的都知道確實優惠。如果有人看到覺得不合適&#xff0c;不想看到&#xff0…

Win7 訪問共享時輸入正確密碼仍然提示密碼錯誤

1、直接按下winr鍵&#xff0c;輸入secpol.msc&#xff0c;打開本地安全策略。 2、找到“安全設置”的“本地策略”的“安全選項” 3、在右邊一欄找到“網絡安全&#xff1a;LAN管理器身份驗證級別”&#xff0c;雙擊進入 4、在默認狀態選項下&#xff0c;英文版應該為"no…

怎么實現頁面友好跳轉_如何實現軟,友好和一致的UI設計

怎么實現頁面友好跳轉重點 (Top highlight)Design trends are constantly changing, aren’t they? Each month there is a new visual effect or a trick that becomes “設計趨勢在不斷變化&#xff0c;不是嗎&#xff1f; 每個月都有一個新的視覺效果或技巧&#xff0c;成為…

前端趨勢 2022

大家好&#xff0c;我是若川。持續組織了近一年的源碼共讀活動&#xff0c;感興趣的可以 加我微信lxchuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外&…

MySQL Connector/ODBC 5.2.2 發布

MySQL Connector/ODBC 5.2.2 發布&#xff0c;這是一個穩定版本&#xff0c;下載地址&#xff1a; http://dev.mysql.com/downloads/connector/odbc/5.2.html MySQL Connector/ODBC 是 MySQL 官方發布的 ODBC 驅動程序包。轉載于:https://www.cnblogs.com/shihao/archive/2012/…

優秀測試管理工具必備九大功能分析

摘要&#xff1a;測試管理工具對測試的重要性毋庸質疑&#xff0c;兩位筆者有著多年的測試實戰經驗&#xff0c;對市面上的一些測試管理工具有過一定的研究&#xff0c;還根據目前比較流行的敏捷開發過程設計了一款測試管理工具。 這篇文章算是對這個設計過程的總結與分享&…

lightroom預設使用_在Lightroom中使用全景圖增強照片游戲

lightroom預設使用Everyone here has taken a panorama with an iphone. We’ve spun around in a circle, trying to keep that arrow right on the line, and more than likely ended up with a strange, squiggly, horizontal photo. Every so often you might get lucky an…

第91次TC39會議舉行,這還是我認識的JS嗎?

大家好&#xff0c;我是若川。持續組織了近一年的源碼共讀活動&#xff0c;感興趣的可以 加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

android調節音量——AudioManager的應用

Android中可以通過程序獲取系統手機的鈴聲和音量。同樣&#xff0c;也可以設置鈴聲和音量。Android中給出了AudioManager類來實現音量獲取、音量控制。本篇基于 Android API 中的 AudioManager 作講述&#xff0c;最后給出實例。下面是本篇大綱&#xff1a;1、認識 AudioManage…

靜態創意和動態創意_再次發揮創意需要什么?

靜態創意和動態創意重點 (Top highlight)According to Oxford dictionary, creativity means “1. Inventiveness. 2. the use of imagination or original ideas to create something.”根據牛津詞典&#xff0c;創造力意味著“ 1。 創造力。 2.利用想象力或獨創性的思想來創造…

oracle 存儲過程 stored procedure 查詢一條記錄或多條記錄

創建基本表 -- Create table create table USER_INFORMATION ( P_ID NUMBER, USER_LOGIN_NAME NVARCHAR2(30) ) 創建包: create or replace package pack_test is type cur_test is ref cursor; end pack_test; / --這個不能少呀&#xff0c;加上這個就可以在…

我寫了 ahooks 源碼分析系列,收到官方邀請我一起維護,這是一次提 PR 的記錄...

大家好&#xff0c;我是若川。持續組織了近一年的源碼共讀活動&#xff0c;感興趣的可以 加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

Hdu 4415 Assassin's Creed 【貪心】.cpp

題意&#xff1a; 某A有一個劍 堅韌度為m 他可以用這個劍去攻打別的隊伍 殺掉第 i 個隊伍需要消耗的堅韌度為 Ai 并可以用得到的劍去打別的隊(Bi個) 但是打完別的隊這個劍就不能用了 問怎么用最少的堅韌度擊敗最多的隊伍 給出T組樣例 每個樣例給出n m n表示有n個隊 接下來n行給…

ahooks 整體架構篇,大家都能看得懂

大家好&#xff0c;我是若川。持續組織了近一年的源碼共讀活動&#xff0c;感興趣的可以 加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

gif動態圖gif出處_我喜歡GIF的怪異事物

gif動態圖gif出處I was recently reminded that I never wrote down all the weird things I learned about the GIF file format when implementing GIF decoding/playback at work last year. (I was reminded of this because I wrote a line in a corporate blog post draf…

C#字符串學習筆記

前言&#xff1a;記得我們老師說過一句話&#xff0c;對字符串的學習程度就是當別人打你一拳你知道痛的情況&#xff0c;所以字符串的處理我們必須學的差不多&#xff0c;這幾篇博客完全是我的學習過程中記錄的筆記&#xff0c;在這里分享一下讓很多剛開始學習.net編程的人能夠…

Git基礎教程(必學)

大家好&#xff0c;我是若川。持續組織了近一年的源碼共讀活動&#xff0c;感興趣的可以 加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…