【數據結構】鏈表應用——箱子排序

見識短淺的我長知識了

小結

讓鏈表的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;  // 釋放內存
}

頭文件傳送門 "bin_sort.h""linear_list.h"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章