常用排序算法时间复杂度
排序算法 | 最差时间复杂度 | 平均时间复杂度 | 稳定度 |
---|---|---|---|
插入排序 | O(n^2) | O(n^2) | 稳定 |
希尔排序 | O(n^2) | O(n^1.3) | 不稳定 |
冒泡排序 | O(n^2) | O(n^2) | 稳定 |
快速排序 | O(nlog2n) | O(nlog2n) | 不稳定 |
选择排序 | O(n^2) | O(n^2) | 不稳定 |
堆排序 | O(nlog2n) | O(nlog2n) | 不稳定 |
归并排序 | O(nlog2n) | O(nlog2n) | 稳定 |
插入排序
已知待排序的一组记录:60, 71, 49, 11, 82, 49, 3, 66
排序过程如下:
60, 71, 49, 11, 82, 49, 3, 66
[60] 71, 49, 11, 82, 49, 3, 66
[60, 71] 49, 11, 82, 49, 3, 66
[49, 60, 71] 11, 82, 49, 3, 66
[11, 49, 60, 71] 82, 49, 3, 66
[11, 49, 60, 71, 82] 49, 3, 66
[11, 49, 49, 60, 71, 82] 3, 66
[3, 11, 49, 49, 60, 71, 82] 66
[3, 11, 49, 49, 60, 66, 71, 82]
代码实现:
public void insertSort(int[] array) {
for (int i = 1; i < array.length; i++) {
for (int j = i; j > 0 && array[j] < array[j - 1]; j--) {
int temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
希尔排序
已知待排序的一组记录:60, 71, 49, 11, 82, 49, 3, 66
排序过程如下:
60, 71, 49, 11, 82, 49, 3, 66
60, 49, 49, 11, 82, 71, 3, 66
60, 49, 3, 11, 82, 71, 49, 66
60, 49, 3, 11, 82, 71, 49, 66
3, 49, 60, 11, 82, 71, 49, 66
3, 11, 60, 49, 82, 71, 49, 66
3, 11, 60, 49, 82, 71, 49, 66
3, 11, 60, 49, 82, 71, 49, 66
3, 11, 49, 49, 60, 71, 82, 66
3, 11, 49, 49, 60, 66, 82, 71
3, 11, 49, 49, 60, 66, 82, 71
3, 11, 49, 49, 60, 66, 82, 71
3, 11, 49, 49, 60, 66, 82, 71
3, 11, 49, 49, 60, 66, 82, 71
3, 11, 49, 49, 60, 66, 82, 71
3, 11, 49, 49, 60, 66, 82, 71
3, 11, 49, 49, 60, 66, 71, 82
代码实现:
public void shellSort(int[] array) {
for (int gap = array.length / 2; gap > 0; gap /= 2) {
for (int i = gap; i < array.length; i++) {
int temp = array[i];
int j;
for (j = i - gap; j >= 0 && temp < array[j]; j -= gap) {
array[j + gap] = array[j];
}
array[j + gap] = temp;
after();
}
}
}
冒泡排序
已知待排序的一组记录:60, 71, 49, 11, 82, 49, 3, 66
排序过程如下:
60, 49, 11, 71, 49, 82, 3, 66
49, 11, 60, 49, 71, 3, 66, 82
11, 49, 49, 60, 3, 66, 71, 82
11, 49, 49, 3, 60, 66, 71, 82
11, 49, 3, 49, 60, 66, 71, 82
11, 3, 49, 49, 60, 66, 71, 82
3, 11, 49, 49, 60, 66, 71, 82
代码实现:
public void bubbleSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
快速排序
已知待排序的一组记录:60, 71, 49, 11, 82, 49, 3, 66
排序过程如下:
base = 60
3, 49, 49, 11, 60, 82, 71, 66
base = 3
3, 49, 49, 11, 60, 82, 71, 66
base = 49
3, 11, 49, 49, 60, 82, 71, 66
base = 11
3, 11, 49, 49, 60, 82, 71, 66
base = 82
3, 11, 49, 49, 60, 66, 71, 82
base = 66
3, 11, 49, 49, 60, 66, 71, 82
代码实现:
public void quickSort(int[] array, int left, int right) {
if (left < right) {
int i = left;
int j = right;
int base = array[i];
System.out.println("base = " + base);
while (i < j) {
while (i < j && array[j] >= base) {
j--;
}
array[i] = array[j];
while (i < j && array[i] <= base) {
i++;
}
array[j] = array[i];
}
array[i] = base;
after();
quickSort(array, left, j - 1);
quickSort(array, j + 1, right);
}
}
选择排序
代码实现:
public void selectionSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
int index = i;
for (int j = i + 1; j < array.length; j++) {
if (array[index] > array[j]) {
index = j;
}
}
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
}
堆排序
代码实现:
public void heapSort(int[] array) {
for (int i = array.length / 2; i >= 0; i--) {
heapSortExchange(array, i, array.length);
}
for (int i = array.length - 1; i > 0; i--) {
int temp = array[i];
array[i] = array[0];
array[0] = temp;
heapSortExchange(array, 0, i);
}
}
public void heapSortExchange(Integer[] array, int parent, int length) {
int temp = array[parent];
int leftChild = 2 * parent + 1;
while (leftChild < length) {
if (leftChild + 1 < length && array[leftChild] < array[leftChild + 1]) {
leftChild++;
}
if (temp > array[leftChild]) {
break;
}
array[parent] = array[leftChild];
parent = leftChild;
leftChild = 2 * leftChild + 1;
}
array[parent] = temp;
}
归并排序
已知待排序的一组记录:60, 71, 49, 11, 82, 49, 3, 66 排序过程如下:
[60, 71, 49, 11, 82, 49, 3, 66] [60, 71, 49, 11] [82, 49, 3, 66] [60, 71] [49, 11] [82, 49] [3, 66] [60] [71] [49] [11] [82] [49] [3] [66] [60, 71] [49, 11] [82, 49] [3, 66] [11, 49, 60, 71] [3, 49, 66, 82] [3, 11, 49, 49, 60, 66, 71, 82]
代码实现:
public void mergeSort(Integer[] array, int leftMargin, int rightMargin) {
if (leftMargin < rightMargin) {
int median = (leftMargin + rightMargin) / 2;
mergeSort(array, leftMargin, median);
mergeSort(array, median + 1, rightMargin);
merge(array, leftMargin, median, rightMargin);
}
}
public void merge(Integer[] array, int leftMargin, int median, int rightMargin) {
int leftArray[] = new int[median - leftMargin + 1];
int rightArray[] = new int[rightMargin - median];
int i, j, k;
for (i = 0, k = leftMargin; i < leftArray.length; i++, k++) {
leftArray[i] = array[k];
}
for (j = 0, k = median + 1; j < rightArray.length; j++, k++) {
rightArray[j] = array[k];
}
for (i = 0, j = 0, k = leftMargin; i < leftArray.length && j < rightArray.length; k++) {
if (leftArray[i] > rightArray[j]) {
array[k] = rightArray[j++];
} else {
array[k] = leftArray[i++];
}
}
if (i < leftArray.length) {
for (j = i; j < leftArray.length; j++, k++) {
array[k] = leftArray[j];
}
}
if (j < rightArray.length) {
for (i = j; i < rightArray.length; i++, k++) {
array[k] = rightArray[i];
}
}
}