演算法導論 8 3 排序不同長度的資料項

2021-06-14 16:16:48 字數 3160 閱讀 6622

分類: 演算法導論

2012-06-23 15:14

298人閱讀收藏 

舉報演算法

delete

stringc測試

ie 目錄(?)

[+]

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

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

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

a)先用計數排序演算法按數字位數排序o(n),再用基數排序的方法分別對每個桶中的元素排序o(n)

b)遞迴使用計數排序,先依據第乙個字母進行排序,首字相同的放在同一組,再對每一組分別使用計數排序的方法比較第二個字母

見到有人用字典樹,也是可以的,見

演算法導論-12-2-基數樹

[cpp]view plain

copy

//8-2-a

#include 

#include 

using

namespace

std;  

intlength_a;  

void

print(

int*a)  

intdigit(

intx)  

return

ret;  

}  //基數排序呼叫的穩定排序

void

counting_sort(

int*a, 

int*b, 

intk)  

//c[i]表示所以<=i的數字出現過的次數

for(i = 1; i <= k; i++)  

c[i] = c[i] + c[i-1];  

//初始化b為0,b用於輸出排序結果

for(i = 1; i <= length_a; i++)  

b[i] = 0;  

for(j = length_a; j >= 1; j--)  

delete

c;  

delete

d;  

}  //基數排序呼叫的穩定排序

void

stable_sort(

int*a, 

int*b, 

intk, 

intd,

intstart, 

intend)  

//c[i]表示所以<=i的數字出現過的次數

for(i = 1; i <= k; i++)  

c[i] = c[i] + c[i-1];  

//初始化b為0,b用於輸出排序結果

for(i = 1; i <= length_a; i++)  

b[i] = 0;  

for(j = end; j >= start; j--)  

delete

c;  

delete

d;  

}  void

radix_sort(

int*a, 

int*b, 

intk ,

intdigit, 

intstart, 

intend)  

}  intmain()  

else

}  }  delete

a;  

delete

b;  

}  

[cpp]view plain

copy

#include 

#include 

using

namespace

std;  

intlength_a;  

void

print(string *a)  

//基數排序呼叫的穩定排序,a是輸入,b是中間輸出,c是計數,d表示對第d位字母排序,start和end分別是排序段的起點和終點

void

counting_sort(string *a, string *b, 

int*c, 

intd, 

intstart, 

intend)  

//c[i]表示所以<=i的數字出現過的次數

for(i = 1; i <= 26; i++)  

c[i] = c[i] + c[i-1];  

//初始化b為0,b用於輸出排序結果

for(i = 1; i <= length_a; i++)  

b[i] = ""

;  for

(j = end; j >= start; j--)  

delete

d;  

//輸出轉為輸入

for(i = start; i <= end; i++)  

a[i] = b[i];  

char

c = 

'a';  

ints, e;

//進一步的排序以s為起點,e為終點

//對於排序的這一段,對下乙個字母遞迴使用計數排序

for(i = start; i <= end; i++)  

else

else

}  }  }  

intmain()  

print(a);  

string *b = new

string[length_a+1];  

int*c = 

newint

[26];  

//計數排序

counting_sort(a, b, c, 0, 1, length_a);  

print(a);  

delete

a;  

delete

c;  

return

0;  

}  

四、效果:

演算法導論習題8 3 排序不同長度的資料項

題目 a 給定乙個整數陣列,其中不同的整數中包含的數字個數可能不同,但是該陣列中,所有整數中總的數字數為n。說明如何在o n 時間內對該陣列進行排序 b 給定乙個字串陣列,其中不同的串包含的字元個數可能不同,但所有串中總的字元個數為n。說明如何在o n 時間內對該陣列進行排序 注意此處的順序是指標準...

演算法導論習題8 3 排序不同長度的資料項

題目 a 給定乙個整數陣列,其中不同的整數中包含的數字個數可能不同,但是該陣列中,所有整數中總的數字數為n。說明如何在o n 時間內對該陣列進行排序 b 給定乙個字串陣列,其中不同的串包含的字元個數可能不同,但所有串中總的字元個數為n。說明如何在o n 時間內對該陣列進行排序 注意此處的順序是指標準...

演算法導論 1 排序演算法

排序演算法是最基礎的一類演算法。主要排序演算法包括選擇排序 插入排序 氣泡排序 合併排序 堆排序和快速排序。把這些排序演算法全部實現一邊,再把 演算法導論 對應章節後面的習題做一遍,確實是系統學習演算法的乙個不錯的開端。選擇排序的想法很簡單,把需要排序的陣列看成一堆撲克牌 先查一遍,抽出最小的作為第...