借用一張圖,直觀對比各種排序算法的性能
1.快速排序
要點:每次選擇一個**基準元素**pivot,將小於pivot的移到左邊,大於pivot的移到右邊。
這個動圖很贊 這裏寫鏈接內容
int mypartition(int* array, int left, int right) {
int pivot = array[left];
int low = left, high = right;
while (low < high) {
while (low<high&&array[high]>=pivot)//注意等於號
--high;
array[low] = array[high];
while (low < high&&array[low] <= pivot)//注意等於號
++low;
array[high] = array[low];
}
array[low] = pivot;
return low;
}
void myQuickSort(int* array, int left, int right) {
if (left < right) {
int pivot = mypartition(array, left, right);
myQuickSort(array, left, pivot - 1);
myQuickSort(array, pivot + 1, right);
}
}
2、冒泡排序
兩兩比較,把較大的往右移。一共需要n-1。
冒泡是穩定的,兩兩比較,而且只存在一個方向上的移動。
//升序
void bubbleSort(int* A, int n) {
for (int i = 1; i < n; i++) {
for (int j = 0; j < n - i; j++) {
if (A[j] > A[j + 1])//大的往右移
swap(A[j], A[j + 1]);
}
}
}
3、選擇排序
每趟選出待排序元素中最小的一個,與前面的交換。
不穩定:因爲位於前面的元素可能會被換到最後面。
//升序
void selectSort(int* A, int n) {
for (int i = 0; i < n - 1; i++) {
int k = i;
for (int j = i + 1; j < n; j++) {
if (A[j] < A[k])//記錄最小的元素下標
k = j;
}
swap(A[i], A[k]);
}
}
4、插入排序
假設左邊是有序的,右邊是無序的。把右邊的元素依次插入左邊。
插入的規則:往左比較,如果小於左邊,則把左邊的元素右移騰出位置。
穩定的
void insertSort(int* A, int n) {
int j;
for (int i = 1; i < n; i++) {
int v = A[i];
int j = i - 1;
for (; j >= 0 && v < A[j]; j--)//如果小於,其他元素右移騰出一個位置
A[j + 1] = A[j];
A[j+1] = v;
}
}
5、歸併排序
分治法,把數據分成很多小份讓它們有序,然後再合併
是穩定的。
void merge(int*A, int left,int mid, int right, int* temp) {
int i = left, j = mid + 1;
int m = mid, n = right;
int k = 0;
while (i <= m&&j <= n) {
if (A[i] <= A[j])//小的先放左邊
temp[k++] = A[i++];
else
temp[k++] = A[j++];
}
while (i <= m)
temp[k++] = A[i++];
while (j <= n)
temp[k++] = A[j++];
for (i = 0; i < k; i++)
A[left + i] = temp[i];
}
void mergeSort2(int* A, int left, int right,int* temp) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort2(A, left, mid, temp);
mergeSort2(A, mid + 1, right, temp);
merge(A, left, mid, right, temp);
}
}
參考博文:
視覺直觀感受7種常用排序算法
八大排序算法