1、計數排序
如果給定上下界,並且區間不大的話,最適用。
比如對於英文本母陣列進行排序。
時間複雜度o(n),空間複雜度o(n)
void countsort(int a, int n, int low, inthigh)
int ind = 0
;
for(int i = 0; i < size; i ++)
}}
2、氣泡排序(基礎版)
最基礎的排序演算法,相鄰元素兩兩比較並交換。
時間複雜度o(n2),空間複雜度o(1)。穩定排序。
void bubblesort(int a, intn) }
}
3、氣泡排序(加速版)
如果中間結果已經有序,即一次遍歷過程中不存在需要交換的相鄰元素,則結束返回。
時間複雜度o(n2),空間複雜度o(1)。穩定排序。
void bubblesortac(int a, intn) }
if(exchange == false
)
return
; }
}
4、選擇排序
遍歷過程中選擇最大元素,與末尾元素交換。
時間複雜度o(n2),空間複雜度o(1)。不穩定排序。
void selectsort(int a, intn) }
if(ind !=i)
swap(a[ind], a[i]);
}}
5、插入排序
將當前元素插入區域性有序的陣列中。
時間複雜度o(n2),空間複雜度o(1)。穩定排序。
void insertsort(int a, intn) a[cur+1] =value;
}}
6、快速排序
最常用的排序,使用pivot將陣列分成大小兩段,遞迴完成排序。
時間複雜度平均o(nlogn),最壞情況(已排序或逆序)o(n2),空間複雜度o(1)。不穩定排序。
int partition(int a, int low, inthigh)
else
break
;
while(low < high && a[low] <=pivot)
low ++;
//a[low] > pivot
if(low else
break
; }
a[low] =pivot;
return
low;
}void quicksort(int a, int low, int
high)
}
7、堆排序
分為建堆與交換兩個過程。
通常用於陣列中尋找最大/小的k個元素。
時間複雜度o(nlogn),空間複雜度o(1)。不穩定排序。
void siftdown(int a, int start, intend)
}a[i] =temp;
}void heapsort(int a, int
n)}
8、歸併排序
分為區域性排序與有序歸併。
通常用於記憶體不足,需要與硬碟互動的排序。
時間複雜度o(nlogn),空間複雜度o(n)。穩定排序。
void merge(int a, int start, int mid, intend)
else
}while(i while(j }void mergesort(int a, int start, int
end)
}
C 排序演算法小結
前言 演算法這個東西其實在開發中很少用到,特別是web開發中,但是演算法也很重要,因為任何的程式,任何的軟體,都是由很多的演算法和資料結構組成的。但是這不意味著演算法對於每個軟體設計人員的實際工作都是很重要的。每個專案特點和需求特殊也導致演算法運用場景上不同。但是個人覺得演算法運用的好的話會給自己在...
排序演算法小結 C 實現
include include 排序演算法的穩定性 對於相同的關鍵字,排序之前的位置和排序之後的位置相同,則稱為穩定排序,否則不穩定排序。歸併排序 基本思想為 先分解再合併,在合併的過程中進行排序 穩定排序 平均時間複雜度為 o nlogn 最好時間複雜度o nlogn 最好時間複雜度o nlogn...
排序演算法小結(C 實現)
前言 在這裡總結一下各種排序方式以增強理解和之後複習方便,附帶一些優化方式 目錄 非線性時間 1.比較 1氣泡排序 2快速排序 2.插入 1插入排序 2希爾排序 3.選擇 1選擇排序 2堆排序 4.歸併 1二路歸併 2多路歸併 線性o n 1.計數排序 2.堆排序 3.基數排序 正文 1.簡單氣泡排...