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