十大排序演算法(C )

2021-10-19 17:25:49 字數 4490 閱讀 9156

原理:比較相鄰兩個元素,如果前乙個比後乙個大則交換二者位置(以公升序為例),每進行一輪比較則可以把最大的元素放到相對最後的位置。每進行一輪比較就會有乙個元素變為有序。迴圈對每輪越來越少的元素進行比較則最終變為有序序列。

如果序列元素初始時為有序,則一輪則可進行排序完畢,最好時間複雜度為o(n);如果序列元素初始時是逆序,則需要n-1輪比較,且每輪要進行n-i次比較,最壞時間複雜度為o(n²),平均時間複雜度為o(n²)。

// 氣泡排序

原理:快速排序首先從待排序列中取出乙個元素作為基數,然後分別從序列的兩端進行比較,分別將比基數大的數放在基數的右邊位置,比基數小的元素放在基數的左邊位置;然後分別對基數左右兩部分的資料以相同的原理進行操作(遞迴操作)。

快速排序的平均時間複雜度為o(nlogn),最壞時間複雜度為o(n²),平均時間複雜度為o(nlogn)

//快速排序

void sortfast(int arr, const int& ileft,const int& iright)

arr[i] = iflag; // 放置基數的所在位置

sortfast(arr, ileft, i - 1); // 對基數前半部分進行排序

sortfast(arr, i + 1, iright); // 對基數後半部分進行排序}}

原理:插入排序對少量元素進行排序是比較有效的一種排序方式。插入排序會對資料進行後移,如果資料量較大則移動大量資料的代價就高了。排序從第二個元素開始與之前的元素進行比較找到自己的位置。

如果待排序列是有序的則最好時間複雜度為o(n);如果待排序列是逆序的則最壞時間複雜度為o(n²)

//插入排序

//希爾排序

原理:首先選擇待排序列中最小的元素,將其放置在序列的起始位置,然後再從剩餘的資料中選擇最小的元素放置在已排序序列的末尾。

選擇排序的時間複雜度為o(n²)。

//選擇排序

void sortselect(int arr, const int& ilen)

if(i != iminidx)

std::swap(arr[i], arr[iminidx]);}}

原理:堆排序是以堆這種資料結構進行排序,堆分為大頂堆和小頂堆,類似於完全二叉樹,子節點總是小於或者大於其父節點。

1、大頂堆:每個結點的值都大於等於其子節點的值,用於公升序排序,大頂堆滿足關係arr[i] >= arr[ii2+1] && arr[i] >= arr[2i+2]

2、小頂堆:每個結點的值都小於等於其子節點的值,用於降序排序,小頂堆滿足關係arr[i] <= arr[ii2+1] && arr[i] <= arr[2i+2]

堆排序的時間複雜度為o(nlogn)。

//調節堆

void adjustheap(int arr, const int& istart, const int& iend)

else

break;

}}//堆排序

原理:歸併排序是一種穩定有效的排序演算法。演算法採用分治法,首先是子串行有序,然後再把子序列進行合併,成為乙個完整的序列。

歸併排序的時間複雜度為o(nlogn)。

void margeend(int arr, const int& ilidx, const int& iridx, const int& imid)

); std::unique_ptrparrr(new int[irsize]);

for (int i = ilidx; i < imid; i++)

parrl[i-ilidx] = arr[i];//左邊部分元素

for (int i = imid; i <= iridx; i++)

parrr[i-imid] = arr[i];//右邊部分元素

int iidx1 = 0, iidx2 = 0, icnt = ilidx;

while (iidx1 < ilsize&& iidx2 < irsize)

while (iidx1 < ilsize) //合併剩餘左邊部分元素

arr[icnt++] = parrl[iidx1++];

while (iidx2 < irsize) //合併剩餘右邊部分元素

arr[icnt++] = parrr[iidx2++];

}void marge(int arr, const int& istart, const int& iend)

//歸併排序

void sortmarge(int arr, const int& ilen)

原理:桶排序首先是分配有限個桶,然後把待排序資料根據一定的規則歸類放入不同的桶中,並且在桶中採用一定的策略再次進行排序,最終把桶中的元素進行遍歷便可以得到有序序列。桶排序是以空間獲取時間的排序方式。

//簡單桶排序

原理:計數排序是乙個非基於比較的排序演算法。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為ο(n+k)(其中k是整數的範圍),快於任何比較排序演算法。這是一種犧牲空間換取時間的做法,而且當o(k)>o(nlog(n))的時候其效率反而不如基於比較的排序(基於比較的排序的時間複雜度在理論上的下限是o(nlog(n)), 如歸併排序,堆排序)。

//計數排序

void sortcounter(int arr, const int& ilen)

}

基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。

void startradix(int arr, const int& ilen, const int& iexp)

); std::unique_ptrpcnt(new int[10]);

for (int j = 0; j < ilen; j++)

pcnt[(arr[j] / iexp) % 10]++; //統計每個桶中元素數量

for (int j = 1; j < 10; j++) //計算元素存在於序列中的位置

pcnt[j] += pcnt[j - 1];

for (int j = ilen-1; j >=0; j--) //元素放入臨時陣列

for (int i = 0; i < ilen; i++) //恢復每輪排序的元素到原始陣列中

arr[i] = ptemp[i];

}//基數排序

void sortradix(int arr, const int& ilen)

十大排序演算法(c )

1.氣泡排序 每一輪都從頭開始比較,比較當前數與後一位數,若當前數大於後一位數則進行交換,每一輪都會在末尾得到一位排序正確的數,因此每一輪比較結束,下一輪的比較範圍將縮小 ja j 1 if ischange break 2.插入排序 每一輪將當前數 a i 插入到前面已經排序好的合適位置,因此關鍵...

十大排序演算法

1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...

十大排序演算法

排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...