原理:比較相鄰兩個元素,如果前乙個比後乙個大則交換二者位置(以公升序為例),每進行一輪比較則可以把最大的元素放到相對最後的位置。每進行一輪比較就會有乙個元素變為有序。迴圈對每輪越來越少的元素進行比較則最終變為有序序列。
如果序列元素初始時為有序,則一輪則可進行排序完畢,最好時間複雜度為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...
十大排序演算法
排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...