冒泡排序
稳定性
冒泡排序是一种稳定的排序算法
选择排序效率:O(n2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <stdio.h> #include <stdlib.h>
void bubbleSort(int *array, int len) { #if 0 for (int i= 0; i < len; ++i) { for (int j = 1; j < len - i; j++) { if (array[j] < array[j - 1]) { int tmp = array[j]; array[j] = array[j - 1]; array[j - 1] = tmp; } } } #endif int flag = 0; for (int i = len - 1; i > 0 && flag==0; --i) { flag = 1; for (int j = 0; j < i; ++j) { if (array[j] > array[j + 1]) { int tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp; flag = 0; } } } }
#if 0 void main() { int i; int array[] = { 11, 8, 7, 6, 3 }; int len = sizeof(array) / sizeof(int); printf("待排序数组序列: "); for (i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n");
bubbleSort(array, len);
printf("冒泡排序之后的序列: "); for (i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n"); system("pause"); } #endif
|
选择排序
稳定性
选择排序是不稳定的排序方法
选择排序效率:O(n2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include <stdio.h> #include <stdlib.h>
void selectionSort(int *array, int len) { int min = 0; for (int i = 0; i < len - 1; ++i) { min = i; for (int j = i + 1; j < len; ++j) { if (array[min] > array[j]) { min = j; } } if (min != i) { int tmp = array[min]; array[min] = array[i]; array[i] = tmp; } } }
#if 0 void main() { int i; int array[] = { 12, 5, 33, 6, 10 }; int len = sizeof(array) / sizeof(int); printf("待排序数组序列: "); for (i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n");
selectionSort(array, len);
printf("选择排序之后的序列: "); for (i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n"); system("pause"); } #endif
|
插入排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <stdio.h> #include <stdlib.h>
void insertionSort(int *array, int len) { int tmp = 0; int index = 0; for (int i = 1; i < len; ++i) { index = i; tmp = array[i]; for (int j = i - 1; j >= 0; --j) { if (tmp < array[j]) { array[j + 1] = array[j]; index = j; } else { break; } } array[index] = tmp; } }
#if 0 void main() { int i; int array[] = { 12, 5, 33, 6, 10 }; int len = sizeof(array) / sizeof(int); printf("待排序数组序列: "); for (int i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n");
insertionSort(array, len);
printf("插入排序之后的序列: "); for (i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n"); system("pause"); } #endif
|
稳定性
插入排序是稳定的排序算法
插入排序效率:O(n2)
希尔排序
稳定性
希尔排序是不稳定的排序算法。
希尔排序的效率:O(n*logn)≈ O(1.3*n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include <stdio.h> #include <stdlib.h>
void shellSort(int *array, int len) { int gap = len; while (gap > 1) { gap = gap / 3 + 1; for (int i = 0; i < gap; ++i) { int tmp; int index; for (int j = i + gap; j < len; j += gap) { tmp = array[j]; index = j; for (int k = j - gap; k >= 0; k -= gap) { if (tmp < array[k]) { array[k + gap] = array[k]; index = k; } else { break; } } array[index] = tmp; } } } }
#if 1 void main() { int i; int array[] = { 12, 5, 33, 6, 10 }; int len = sizeof(array) / sizeof(int); printf("待排序数组序列: "); for (int i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n");
shellSort(array, len);
printf("希尔排序之后的序列: "); for (i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n"); system("pause"); } #endif
|
归并排序
稳定性
归并排序是一种稳定的排序算法。
排序效率: O(N*logN)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <stdio.h> #include <stdlib.h>
void mergeArray(int a[], int first, int mid, int last, int temp[]) { int leftStart = first; int leftEnd = mid; int rightStart = mid + 1; int rightEnd = last; int length = 0; int i = leftStart, j = rightStart; while (i <= leftEnd && j <= rightEnd) { if (a[i] <= a[j]) { temp[length++] = a[i++]; } else { temp[length++] = a[j++]; } } while (i <= leftEnd) { temp[length++] = a[i++]; } while (j <= rightEnd) { temp[length++] = a[j++]; } for (i = 0; i < length; i++) { a[leftStart + i] = temp[i]; } }
void mergeSort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergeSort(a, first, mid, temp); mergeSort(a, mid + 1, last, temp); mergeArray(a, first, mid, last, temp); } }
#if 0 void main() { int i; int array[] = { 12, 5, 33, 6, 10 }; int len = sizeof(array) / sizeof(int); printf("待排序数组序列: "); for (i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n");
int *p = (int*)malloc(sizeof(int) * len); if (p == NULL) { return; } mergeSort(array, 0, len - 1, p); free(p);
printf("归并排序之后的序列: "); for (i = 0; i < len; ++i) { printf("%d\t", array[i]); } printf("\n"); system("pause"); } #endif
|
堆排序
将一个数组变成完全二插树

将完全二插树变成大顶堆(每一个父节点数必须大于左右结点数)或小顶堆
最后一个非叶子结点的位置: 数组长度 / 2 - 1

将第一个结点和最后一个结点交换

再次进行一次大顶堆初始化

将第一个结点和倒数第二个结点交换

再次进行大顶堆初始化

将第一个结点和倒数第三个结点交换

然后进行大顶堆优化

将第一个和倒数第四个交换

再次进行大顶堆优化

将第一个和倒数第五个交换

再次进行大顶堆优化

将第一个和倒数第六个交换

进行大顶堆优化

将第一个和倒数第七个交换

进行大顶堆优化

将第一个和倒数第八个交换
因为倒数第八个已经是可以交换的最后一个了,所以不需要大顶堆优化了,这是我们的序列已经排好序了

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include<iostream> #include<ctime> using namespace std; #define MAX 10
void PrintArr(int arr[], int len) { for (int i = 0; i < len; i++) { cout << arr[i] << " "; } cout << endl; }
void Swap(int arr[],int index,int max) { int temp = arr[index]; arr[index] = arr[max]; arr[max] = temp;
} void HeapAdjust(int arr[],int index,int len) { int lchild = index * 2 + 1; int rchild = index * 2 + 2;
int max = index;
if (lchild < len && arr[lchild] > arr[max]) { max = lchild; } if (rchild < len && arr[rchild] < arr[max]) { max = rchild; }
if (max != index) { Swap(arr,index,max); HeapAdjust(arr,max,len); }
} void HeapSort(int arr[],int len) {
for (int i = len / 2 - 1; i >= 0; i--) { HeapAdjust(arr,i,len); }
for (int i = len - 1; i >= 0; i--) { Swap(arr,0,i); HeapAdjust(arr, 0, len); }
}
int arr[MAX]; int main() { int len = sizeof(arr) / sizeof(int); srand((unsigned int)time(NULL)); for (int i = 0; i < MAX; i++) { arr[i] = rand() % 10; } unsigned int start = time(NULL); HeapSort(arr,len); PrintArr(arr,len); unsigned int end = time(NULL);
cout << "time: " << end - start << endl; return 0; }
|
排序总结
