資料結構 排序(插入,選擇,交換,歸併)及其特性

2021-09-14 02:30:34 字數 4376 閱讀 6596

直接插入排序

基本思想:

把待排序的記錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中,直到所有的記錄插入完為止,得到乙個新的有序序列。

//直接插入排序

void

insertsort

(int

* array,

int size)

if(j != i -1)

}}

直接插入排序的特性總結:

元素集合越接近有序,直接插入排序演算法的時間效率越高

時間複雜度:o(n^2)

空間複雜度:o(1),它是一種穩定的排序演算法

穩定性:穩定

希爾排序(縮小增量排序)

基本思想:

先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。

//希爾排序

void

shellsort

(int

* array,

int size)

if(j != i - gap)

array[k + gap]

= temp;}}

gap--;}

}

希爾排序的特性總結:

希爾排序是對直接插入排序的優化。

當gap > 1時都是預排序,目的是讓陣列更接近於有序。當gap == 1時,陣列已經接近有序的了,這樣就會很快。這樣整體而言,可以達到優化的效果。我們實現後可以進行效能測試的對比。

希爾排序的時間複雜度不好計算,需要進行推導,推導出來平均時間複雜度: o(n1.3—n2)

穩定性:不穩定

每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完 。

選擇排序

基本思想:

在元素集合array[i]–array[n-1]中選擇關鍵碼最大(小)的資料元素;

若它不是這組元素中的最後乙個(第乙個)元素,則將它與這組元素中的最後乙個(第 乙個)元素交換;

在剩餘的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重複上述步驟,直到集合剩餘1個元素;

//選擇排序

void

selectionsort

(int

* array,

int size)

if(max != last)

swap(&

(array[max]),

&(array[last]))

; last--;}

}

直接選擇排序的特性總結:

直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用

時間複雜度:o(n^2)

空間複雜度:o(1)

穩定性:不穩定

堆排序基本思想:

堆排序(heapsort)是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,它是選擇排序的一種。它是通過堆來進行選擇資料。本質是利用的堆刪除的思想。

需要注意的是排公升序要建大堆,排降序建小堆。

// 堆排序

void

heapadjust

(int

* array,

int size,

int parent)

//向下調整

}void

heapsort

(int

* array,

int size)

//排序---堆的刪除

while

(n >0)

}

堆排序的特性總結:

堆排序使用堆來選數,效率就高了很多。

時間複雜度:o(n*logn)

空間複雜度:o(1)

穩定性:不穩定

基本思想:

所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動

氣泡排序

//氣泡排序1.0

void

bubblesort2

(int

* array,

int size)}}

}//氣泡排序2.0

void

bubblesort1

(int

* array,

int size)}}

}

氣泡排序的特性總結:

氣泡排序是一種非常容易理解的排序

時間複雜度:o(n^2)

空間複雜度:o(1)

穩定性:穩定

快速排序

基本思想:

任取待排序元素序列中的某元素作為基準值,按照該排序碼將待排序集合分割成兩子串行,左子串行中所有元素均小於基準值,右子串行中所有元素均大於基準值,然後最左右子串行重複該過程,直到所有元素都排列在相應位置上為止。

將區間按照基準值劃分為左右兩半部分的常見方式有:

hoare版本

挖坑法

//快速排序

//hoare法

intpartition_1

(int

* array,

int left,

int right)

if(array[begin]

!= key)

swap(&

(array[begin]),

&key)

;return begin;

}void

qsort_1

(int

* array,

int left,

int right)

}//挖坑法

intpartition_2

(int

* array,

int left,

int right)

array[begin]

= key;

return begin;

}void

qsort_2

(int

* array,

int left,

int right)

}

快速排序的特性總結:

快速排序整體的綜合性能和使用場景都是比較好的,所以才敢叫快速排序;

時間複雜度:o(n*logn);

空間複雜度:o(logn);

穩定性:不穩定;

基本思想:

歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

void

mergedata

(int

* array,

int left,

int mid,

int right,

int* temp)

while

(begin1 < end1)

temp[index++

]= array[begin1++];

while

(begin2 < end2)

temp[index++

]= array[begin2++];

}void

mergesortnor

(int

* array,

int size)

memcpy

(array, temp, size*

sizeof

(array[0]

)); gap *=2

;}free

(temp)

;}

歸併排序的特性總結:

歸併的缺點在於需要o(n)的空間複雜度,歸併排序的思考更多的是解決在磁碟中的外排序問題。

時間複雜度:o(n*logn)

空間複雜度:o(n)

穩定性:穩定

keep running

插入,選擇,交換,歸併,基數排序

1.插入排序 1.1 直接插入排序 將後面的元素插入到前面已經排好的序列 穩定 空間代價 1 時間代價 n n 直接插入排序 template void improvedinsertsort record array,int n array j 1 temprecord 1.2 shell 排序 依...

資料結構 排序總結 冒泡 插入 選擇 歸併

在我們看到,無論是氣泡排序,插入排序或者是選擇排序,時間複雜度都可能是是o n 2 為什麼這三種排序時間複雜度都有可能是n 2而二路歸併是o nlog n 讓我們先看看前三種排序方法 通過以上排序方式,我們都不難發現,這些排序其實是在做兩種事情,乙個是比較,乙個是按照比較的結果做出位置的變換.其中位...

冒泡 插入 選擇 歸併排序

演算法原理 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。若檔案的初始狀態是正序...