1. 程式人生 > >高自由度:c++八大排序演算法實現程式碼和原理

高自由度:c++八大排序演算法實現程式碼和原理

網上有很多八大排序的程式碼,不過那都比較簡約,只是想表明演算法原理。當然也有個人的部落格寫的也是很好的。我寫的八大排序演算法有以下幾個特點:
1、只要改變一個數值,就能實現從小到大或從大到小的排序。
2、改變一個N的值可以隨便改變排序陣列的元素的多少。
3、排序適合int、long、float、double、char型別的排序,只要改變一個ArrayType的型別就行。
4、八大排序中,有些都是改進的演算法。
5、有檢查排序正確函式和2個有序陣列的歸併函式,這些比較常用的。
6、排序函式都有註釋原理和每步實現原因。
(若是有對八大排序不懂得,建議看下下面網址關於八大排序具體介紹:(不過我寫的排序原理並不完全同於下面網址的,不過有寫原理。)

《《《註明:轉載請提示出處:http://blog.csdn.net/hguisu/article/details/7776068》》》
這些改變可能也不是很難,但是可以嵌入使用,以後不用寫排序程式碼,只要自己把標頭檔案包含進去,就可以進行選擇哪種排序方式排序了。因為很多改變只要改變標頭檔案,所以自由度和方便都挺高的。下面是我關於排序演算法的.h檔案:
#ifndef _SORT_H 
#define _SORT_H


//標頭檔案包含 
#include "iostream"
#include "malloc.h"
#include "Queue.h" // 這是我以前寫好的佇列,在基數排序中要用的佇列 


/////////////////////////////改這些你想要的陣列長度,型別,進位制(限基數排序),排序方向//////////////////////////////////////////////////////////



//陣列的元素長度: 在這裡改寫可以了 
#define N 10 


//基數排序要用到的進位制數:可以隨便改寫,但是前提時輸入也要是對應的進位制數才行 
#define Dec 10 


// 0表示小於,1表示大於,用於改變排序中的比較,相當於0表示從小到大,1表示從大到小
//(由於基數排序是運用佇列,所以不適合改變,只能改函式,當從大到小時,檢查排序錯誤的函式會錯誤。)
#define B_S 1 


using namespace std;


//陣列的型別:可以是char(小心基數排序),int,long,float等等能排序型別(這裡的基數排序只適合整型) 
#define ArrayType int 


/////////////////////////////////////////////////////////////////////////////////////////////////////


//1、直接插入排序:
extern void InsertSort( ArrayType *array );



//2、希爾排序:
extern void ShellSort( ArrayType *array );


//3、改進的氣泡排序:(這種改進方式時間複雜度是原有的氣泡排序減少2倍以上) 
extern void ImpovedBubbleSort( ArrayType *array );


//4、快速排序:
extern void QuickSort( ArrayType *array, int low, int high ); 


//5、二元選擇排序:(選擇排序的改進,在VS中有寫,這裡比一般選擇排序間複雜度減少2倍) 
extern void SelectSort( ArrayType *array );


//6、堆排序:
//(1)建立大根堆:
extern void CreateHeep( ArrayType *array, int n );


//(2)堆排序: 
extern void HeepSort( ArrayType *array );


//7、歸併排序:
//(1)歸併陣列:(此歸併陣列可以歸併2個不同有序陣列,也可以歸併相同有序陣列)
extern ArrayType * MergeArray( ArrayType *array1, int low1, int n1, ArrayType *array2, int low2, int n );


//(2)分治法歸併排序:
extern void MergeSort( ArrayType * array, int low, int high );


//8、基數排序:
extern void RadixSort( ArrayType * array );


//陣列的輸出
extern void PrintArray( ArrayType *array, int n ); 


//測試排序正確的函式
extern void TestSort( ArrayType *array );


//改變從小到大,從大到小的函式
extern bool Big_small( ArrayType small, ArrayType big );


#endif

當然福利是福利,這是我瞭解排序到實現,全自己根據演算法原理寫下來,在比較、修改、改善、改錯慢慢過來的,花費兩三天時間才完成(注意的是:基數排序在我的VC++6.0實現沒問題,在Dec++是有點問題的花了好長時間,不知道原因,不過猜測是我寫佇列可能出現了問題,到時你們可以自己寫下佇列測試下,不過放心能執行,演算法沒問題的)。

上次幾張測試圖:

我可能還是個初入茅廬的新手,所以程式碼中有些不足之處,可以留言給我,當然你們要是有更好的想法,可以進行修改分享。當然有可能我測試不夠多,如發現有錯誤請留言給我,因為我是通過隨機數來測試的。謝謝瀏覽,還望指教。有上傳檔案,要是下載有問題,可以用下面網址下載

裝載請註明(建立人:哈哈沃,交流群:580072227)