幾種常見的排序演算法c 實現

2021-10-04 06:19:07 字數 3472 閱讀 1565

一、選擇排序

演算法思想:對於有n個元素的陣列,一共有n躺排序,每趟排序要保證前i

ii項元素已經排好序,對於第i

ii趟排序,從第i

ii個元素開始遍歷陣列,將當前遍歷元素中最小的值與第i個元素交換。具體**實現如下:

#include

#include

#include

using

namespace std;

class

sortalg

}swap

(array[i]

, array[index]);

//每趟排序後交換

}return;}

};intmain()

; sortalg solution;

solution.

selectionsort

(array)

; vector<

int>

::iterator it = array.

begin()

;while

(it != array.

end())

cout<<

*it++

}

演算法時間複雜度分析:平均複雜度為o(n

2)

o(n^2)

o(n2

);最好情況考慮當前陣列已經有序,則內層迴圈無法進去,即為o(n

)o(n)

o(n)

穩定性分析:不穩定排序。考慮陣列,第一次排序第乙個5和後面的2交換,即此時原來陣列位於乙個5在排序後已經在第二個5後面,所以是不穩定排序。

二、插入排序

演算法思想:由n−1

n-1n−

1趟排序組成。對於第i

ii趟排序,保證第0項到第i

ii項元素為已排序狀態。注意和選擇排序的區別:**選擇排序每趟排序保證前i

ii項對於整個陣列來說是排好序的,而插入排序只保證區域性排序好的。**有點繞,分析下**就可以知道原理:

void

insertsort

(vector<

int>

& array)

}return

;}

演算法時間複雜度分析:平均和最優都和選擇排序一樣,分析的情況也一樣。是穩定排序

三、快速排序

void

quicksort

(vector<

int>

& array,

int begin,

int end)

while

(begin < end && array[begin]

< temp)

begin++;if

(begin < end)

} array[begin]

= temp;

if(begin-

1> temp_begin)

quicksort

(array, temp_begin, begin-1)

;if(temp_end > end +1)

quicksort

(array, end +

1, temp_end)

;return

;}

演算法分析
:時間平均複雜度是o(n

logn

)o(nlogn)

o(nlog

n),不穩定排序。

四、堆排序

演算法思想:主要就是構建乙個完全二叉樹,首先要知道幾個二叉樹的性質:1.對於乙個有n個結點的完全二叉樹來說,第乙個非葉子結點的序號為i=n

2−

1i=\dfrac-1

i=2n​−

1;2.對於乙個結點i

ii來說,如果它有左右子結點,則左結點序號為2∗i

+1

2*i+1

2∗i+

1,右結點序號為2∗i

+2

2*i+2

2∗i+

2這篇部落格講得很清晰,**並茂:堆排序。本人實現的**如下所示:

void

adjust_heap

(vector<

int>

& array,

int size,

int index)

}//堆排序

void

heapsort

(vector<

int>

& array,

int size,

int k)

//找到最大根,將其和最後乙個元素交換,然後繼續調整;

for(

int i = size -

1; i >

0; i--

)}

演算法分析:時間平均複雜度是o(n

logn

)o(nlogn)

o(nlog

n),不穩定排序。

五、歸併排序

演算法思想:主要思想還是分治思想,將當前需要排序的陣列遞迴分治成子陣列(直到遞迴到只有乙個元素時停止,因為一組乙個元素肯定是有序的),比如已知遞迴到array[0]和array[1]先比較大小,array[2]和array[3]再比較大小…依次比較完。之後在將array[0]和array[1]組成有序的陣列跟array[2]和array[3]組成有序的陣列比較…這個過程就叫做歸併過程。個人覺得講得比較清楚的部落格是:歸併排序。

演算法分析:每個元素大概需要log

(n

)log(n)

log(n)

次比較,一共有n

nn個元素,所以時間複雜度為o(n

logn

)o(nlogn)

o(nlog

n)。是穩定的排序。

**如下所示:

//輔助排序函式

void

mergehelp

(vector<

int>

&array,

int left,

int mid,

int right)

//歸併排序函式入口

void

mergesort

(vector<

int>

&array,

int left,

int right)

}

幾種常見的排序演算法(C

說到排序,網上一搜就有一大堆的部落格資料,涵蓋各種語言實現,而許多演算法書中更是寫的很詳細,寫此部落格只是記錄下所敲的這幾行 以便日後檢視。直接貼domo ifndef sort h define sort h include include using namespace std template...

幾種常見的排序C實現

include include 氣泡排序從小到大 第一趟得到最大的存到陣列的最後,第二趟得到陣列的第二大的,存到陣列的倒數第二位。依次。void bubble sort int p 列印輸出 for int i 0 i int length 6 取增量 int step length 2 while...

C語言實現幾種常見排序演算法

worker.c created on 2010 7 1 author panfei include void swap int x,int y 插入排序 公升序 void insertsort int arr,int size arr j 1 to insert 選擇排序 降序 void sele...