本文簡單介紹幾種面試中常用的排序演算法,並對每個演算法的時間複雜度、空間複雜度、穩定性進行分析。
(1) 氣泡排序
void swap(int& num1, int& num2)
void bubblesort(int array, int size)
} }}int main(int argc, const char* argv)
;
bubblesort(a, 10);
for (int i=0; i
時間複雜度o(n^2),空間複雜度o(1)。
(2) 選擇排序
(3) 插入排序
(4) 快速排序
void quicksort(int* num, int start, int endend)}/* 從後往前找比value小的數 */
for (; i < j; j--)
} }num[i] = value;
quicksort(num, start, i-1);
quicksort(num, i+1, end);
}void printarray(int* num, int start, int end)
cout << endl;
}int main(int argc, char* argv);
quicksort(array, 0, 9);
printarray(array, 10);
return 0;
}
(5) 堆排序
堆排序是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法。
堆分為大根堆和小根堆,兩者都是完全二叉樹(完全二叉樹的知識請自行學習)。大根堆的要求就是每個節點的值都不大於其父節點的值,即 node->parent->value >= node->value。小根堆則於此相反,每個節點的值都不小於其父節點的值。因為大根堆和小根堆的性質相似,本文僅以大根堆為例進行討論。
由大根堆的性質可知,一組數列如果為大根堆的話,那數列的最大值肯定在堆頂。堆排序就是利用此性質,不斷構建大根堆,不斷選取最大值以進行數列排序。具體過程如下:
(1) 將一組長度為n的無序數列k0, k1, k2, ..., kn-1構建成大根堆。
一言以敝之,就是將無序的待排序數列轉換成
/* 交換兩個數 */
void swap (int* a, int *b)
/* 構建最大堆 */
void buildheap(int array, int size)
i--;
} for (; i > 0; i-=2) }}
/* 最大堆排序 */
void heapsort(int array, int size)}
int main(int argc, const char* argv);
heapsort(a, 10);
for (int i=0; i
(6) 歸併排序
先把**貼上來,有時間再將此帖寫完
/* 將有序陣列 source[start, ..., mid] 和 有序陣列 source[mid+1, ..., end]
* 合併成乙個有序陣列,並將合併的有序陣列寫回source中 */
void merge(int source, int target, int start, int mid, int end)
else }
while (i <= mid)
while (j <= end)
for (i = start; i < k; i++)
}/* 歸併排序 */
void mergesort(int source, int target, int start, int end)
}int main(int argc, char* argv)
; int* b = new int[10];
mergesort(a, b, 0, 9);
for (int i=0; i
演算法複雜度與穩定性
時間複雜度是乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行 測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就...
常用排序演算法複雜度和穩定性總結
排序演算法 平均時間複雜度 最好情況 最壞情況 空間複雜度 穩定性氣泡排序 o n2 o n o n2 o 1 穩定選擇排序 o n2 o n2 o n2 o 1 不穩定插入排序 o n2 o n o n2 o 1 穩定希爾排序 o nlogn o n2 o n2 o n2 o 1 不穩定歸併排序 ...
常用排序演算法 穩定性和複雜度分析
這次簡單的記錄一下演算法的穩定性以及複雜度 如果兩個相等的資料的先後位置,排序前後保持不變的話,那就是穩定的,反之,就是不穩定 例如 a i a j a i 的位置在a j 之前,排序後,a i 的位置依然在a j 之前 1 如果排序演算法是穩定的,那麼從乙個鍵上排序,然後再從另乙個鍵上排序,第乙個...