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

2021-06-07 13:00:33 字數 2291 閱讀 2156

題目:

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

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

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

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

其中桶排序中採用了鍊錶來儲存各個位上的數字。在該演算法中用到了線性時間排序中的三大演算法:桶排序,基數排序,計數排序

具體思路是:首先根據桶排序將不同位數的數字分別放到不同的鍊錶中,位數相同的數字放到同乙個鍊錶中。然後再對每乙個鍊錶中的所有數字進行排序,所採用的排序演算法是基數排序,其中基數排序中採用的穩定排序演算法是計數排序。

linknode.h定義了鍊錶的節點及其操作。

#includeusing namespace std;

class link;

class linknode

linknode(int num):key(num)

{} linknode(int num,linknode *node=null):key(num),next(node)

~linknode()

int getkey()

};

link.h標頭檔案定義了鍊錶常見的操作——插入,刪除,得到長度,將鍊錶中的數儲存到陣列中等。

//鍊錶,實現了鍊錶元素的排列,鍊錶元素個數計算,元素刪除

//元素新增鍊錶元素查詢。

#include#include"linknode.h"

using namespace std;

class link

~link()

void makeempty()

linknode * p=head;

while(head->next!=null)

}//使用陣列初始化鍊錶

void init(int a,int len) }

int getlength()

bool deletehead() }

linknode* gethead()

int getelement(int a)

return length;

} bool insertinorder(int num)

}//如果插入的數字最大則插入到最後

p->next=q;

length++;

return 1;

} bool insert(int num)

int extractelement(int a)

linknode * p=head->next;

while(p!=null)

return length;

} void print() }

};

test.cpp實現了該演算法的詳細過程:

//習題8-3-a,排序不同長度的資料項

//思路是先用桶排序,將不同位數的數字放到不同的鍊錶中,然後將同乙個鍊錶中的各個數字

//按照基數排序來進行排序,其中基數排序中又採用了計數排序來作為穩定的排序演算法

#include#include"link.h"

using namespace std;

link node[100];

//計算給定的乙個數字的位數,用於某個元素插入哪乙個鍊錶。

int computerdigits(int num)

while(num!=0)

return count;

}//使用鍊錶實現的桶排序,將陣列中的數字按照位數的多少分別插入到各個鍊錶。

//其實在插入鍊錶時完全可以採用順序插入(link中的insertinorder函式實現了順序插入),

//但是順序的插入的時間複雜度較高,因此

//此處採用了將數字往煉表頭插入,然後對該鍊錶進行基數排序

int bucketsort(int a,int length)

for(j=length-1;j>=0;j--) }

//**********

//***********

//**********

//將陣列a中的第d位數字進行分割,並存放到陣列b中

void divide(int a,int b,int d,int length)

; for(i=0;i

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

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

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

分類 演算法導論 2012 06 23 15 14 298人閱讀收藏 舉報演算法 delete stringc測試 ie 目錄 a 給定乙個整數陣列,其中不同的整數中包含的數字個數可能不同,但是該陣列中,所有整數中總的數字數為n。說明如何在o n 時間內對該陣列進行排序 b 給定乙個字串陣列,其中不...

演算法導論 1 排序演算法

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