見識短淺的我長知識了
小結
讓鏈表的get、insert、erase
等費時的操作在程序中時間複雜度僅有O(1)!!!
。說明,以後凡是要遍歷一個鏈表類型的,更寬泛地講,是有指針索引的,都在它的首端進行操作!!!
#include <iostream>
#include "bin_sort.h"
#include "linear_list.h"
using namespace std;
/***********文件說明************
* 文件名:bin_sort.cpp
* 文件功能:箱子排序
**/
/****************函數說明************************
* 函數名: void binSort(chain<studentRecord>& theChain, int range)
* 函數參數:一個記錄學生成績的鏈表,成績輸入範圍
* 函數返回值:地址傳遞,從小到大排序的學生成績鏈表
* 函數功能:使用鏈表的多個方法進行箱子排序
* 實現步驟:
1、連續刪除鏈表的首元素,並將其插入插入相應的某個箱子的鏈表首位;
2、從最後一個箱子開始(按照從小到大排序),逐個刪除每個箱子的元素,並將其插入一個初始爲空的鏈表的首位
* 時間複雜度:如果不考慮內存分配異常的話,第一個for循環O(n),第二個for循環O(range),總的時間複雜度O(n+range)
**/
void binSort(chain<studentRecord>& theChain, int range)
{
// 按分數排序
// 對箱子初始化
chain<studentRecord>* bin;
bin = new chain<studentRecord>[range + 1]; // 每一個箱子用一個鏈表表示
// 把學生記錄從鏈表中取出,然後分配到箱子裏
int numberOfElements = theChain.size();
for (int i = 1; i <= numberOfElements; ++i)
{
studentRecord x = theChain.get(0); // 這個方法妙極了,這樣的話get、insert、erase操作都只需要O(1)的時間
theChain.erase(0);
bin[x.score].insert(0, x); // 箱子是一個鏈表結構
}
// 從箱子中收集元素
for (int j = range; j >= 0; --j) // 從最後一個箱子開始,從小到大的順序
{
while (!bin[j].empty()) // 清空這個箱子
{
studentRecord x = bin[j].get(0);
bin[j].erase(0);
theChain.insert(0, x); // 類似於棧,一直從表頭壓入,最大的在最後
}
}
delete[] bin; // 釋放內存
}