1. 程式人生 > >排序總結——————資料結構

排序總結——————資料結構

文章目錄

八中排序方式的對比

資料生成

我採用隨機函式來生成隨機資料,將生成的資料儲存在.txt檔案裡

生成的資料大小範圍在    [ 0 ,

n ]    \; [0,n]\; 內,生成的資料完全是隨機的

其中 n = 1 0

3 , 1 0 4 , 1 0 5
, 1 0 6 n = 10^3, 10^4,10^5,10^6

採用當前時間來作為隨機數種子

srand(time(NULL));//隨機數種子 

生成的資料將儲存在檔名為以下的檔案裡

1 e 3. t x t 1e3.txt

1 e 4. t x t 1e4.txt

1 e 5. t x t 1e5.txt

1 e 6. t x t 1e6.txt

程式碼如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
	freopen("1e6.txt","w",stdout);//輸出到檔案 
	int n = 1e6;//資料量的大小 
	srand(time(NULL));//隨機數種子 
	for(int i=0;i<n;i++)
		printf("%d ",(abs(rand())+n)%n);
	return 0;
}

排序演算法

將會進行以下幾種排序演算法比較,

分別比較它們的

  • 執行時間:(ms)
  • 交換次數:
  • 移動次數:

八中排序演算法:

  1. 插入排序 ( I n s e r t S o r t ) (InsertSort)
  2. 折半插入排序 ( B I n s e r t S o r t ) (BInsertSort)
  3. 希爾排序 ( S h e l l S o r t ) (ShellSort)
  4. 氣泡排序 ( B u b b l e S o r t ) (BubbleSort)
  5. 簡單選擇排序 ( S e l e c t S o r t ) (SelectSort)
  6. 快速排序 ( Q u i c k S o r t ) (QuickSort)
  7. 堆排序 ( H e a p S o r t ) (HeapSort)
  8. 歸併排序 ( M e r g e S o r t ) (MergeSort)

效能比較

img

這些排序演算法的效能比較如上圖所示,我們通過時間複雜度可以看出, O ( n 2 ) O(n^2) 的演算法肯定是最慢的,而堆排序,快速排序,歸併排序的平均時間複雜度是 O ( n &ThinSpace; l o g &ThinSpace; n ) O(n\,log\,n) ,顯然比其他演算法快一些。

我們用這些演算法對相同的隨機資料進行排序,觀察一下它們的執行時間,移動次數,交換次數,來進行更加直觀的分析。

執行時間比較(ms)

排序演算法 資料大小 1e3 1e4 1e5 1e6
InsertSort 1 87 7809 889262
BInsertSort 1 75 6828 838490
ShellSort 0 1 37 413
BubbleSort 3 1 39693 3890712
QuickSort 0 1 15 151
SelectSort 1 120 11775 1131986
HeapSort 0 2 21 564
MergeSort 0 1 23 184

在這裡插入圖片描述
我們觀察執行時間(單位ms),資料是1e3的時候看不出來大的差別,但是當資料逐漸增多,不同的演算法排序所用的時間差別也越來越大!

在資料為1e6的時候,快速排序將1e6的資料排完序僅用了0.1s,而氣泡排序將這些資料排序成功需要花費一個多小時,現在我們做的才僅僅是百萬級別的資料,和普通的演算法相比,優秀的演算法要比它快三萬倍。

在這個大資料的時代,演算法的重要性不言而喻。

移動次數比較

排序演算法 資料大小 1e3 1e4 1e5 1e6
InsertSort 251935 24834732 2498350057 249759429861
BInsertSort 251944 24834740 2498350073 249759429905
ShellSort 11041 204402 3532741 52682333
BubbleSort 250945 24824741 2498250074 249758429906
QuickSort 4770 61112 763306 8243154
SelectSort 995 9990 99988 999957
HeapSort 10553 139191 1725178 20549336
MergeSort 19952 267232 3337856 39902848

在這裡插入圖片描述

交換次數比較

排序演算法 資料大小 1e3 1e4 1e5 1e6
InsertSort 990 9991 99983 999955
BInsertSort 999 9999 99999 999999
ShellSort 3834 57433 763790 8369173
BubbleSort 250945 24824741 2498250074 249758429906
QuickSort 697 6929 74695 867486
SelectSort 995 9990 99988 999957
HeapSort 10553 139191 1725178 20549336
MergeSort 250945 24824741 2498250074 249758429906

在這裡插入圖片描述


本文僅代表個人觀點。