C++八大排序
C++排序算法
- 一、概览
- 二、代码实现
- 1.冒泡排序
- 2.插入排序
- 3.希尔排序
- 4.堆排序
- 5.选择排序
- 6.快速排序
- 7.归并排序
- 三、排序时间、空间复杂度总结
排序,是C++各大算法当中非常常见的一个步骤(过程),通常我们使用便捷的algorithmalgorithmalgorithm头文件下的sortsortsort排序。不过,随着排序的时间复杂度在题目算法中的重要性日益增强,很多排序甚至自成一种算法,别的算法需调用这个算法,而有的排序仅仅是简单的工具。不过,现在我们称每种排序均为“排序算法”。
一、概览
下面常见几种排序的概览
二、代码实现
接下来,我将展示这几种算法的实现方法(代码)
1.冒泡排序
普通版:普通版:普通版:
void BubbleSort(int* a, int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (a[j] > a[j + 1]) {swap(a[j], a[j + 1]);}}}
}
加强版:加强版:加强版:
void BubbleSort(int* a, int n) {for (int i = 0; i < n - 1; i++) {int flag = 1;for (int j = 0; j < n - 1 - i; j++) {if (a[j] > a[j + 1]) {flag = 0;swap(a[j], a[j + 1]);}}if (flag) {break;}}
}
2.插入排序
void Insert(int* a, int n)
{for (int i = 0; i < n - 1; i++) {int j = 0;int tmp = a[i + 1];for (j = i; j >= 0 && tmp < a[j]; j--) {a[j + 1] = a[j];}a[j + 1] = tmp;}
}
3.希尔排序
希尔排序其实是插入排序的进化版
void ShellSort(int* a, int n) {int gap = n;while (gap > 1) {gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++) {int end = i;int tmp = a[end + gap];while (end >= 0) {if (a[end] > tmp) {a[end + gap] = a[end];end -= gap;}else {break;}}a[end + gap] = tmp;}}
}
4.堆排序
void AdjustDown(int*a,int root,int n) {int parent = root;int child = 2 * parent + 1;//向下调整算法while (child < n) {if (child+1<n&&a[child] < a[child + 1]) {++child;}if (a[child] > a[parent]) {swap(a[child], a[parent]);parent = child;child = 2 * parent + 1;}else {break;}}
}void HeapSort(int* a, int n) {for (int i = (n - 2) / 2; i >= 0; i--) {AdjustDown(a, i, n); }int end = n - 1;while (end>0) {swap(a[0], a[end]);AdjustDown(a, 0, end);end--;}}
5.选择排序
void SelectSort(int* a, int n) {int left = 0;int right = n - 1;int minIndex = left, maxIndex = left;while (left < right) {for (int i = left; i <= right; i++) {if (a[i] < a[minIndex]) {minIndex = i;}if (a[i] > a[maxIndex]) {maxIndex = i;}}swap(a[left], a[minIndex]);if (left == maxIndex) {maxIndex = minIndex;}swap(a[right], a[maxIndex]);left++;right--;}
}
6.快速排序
int GetMindIndex(int* a, int left, int right) {//三数取中int mid = (left + right) >> 1;if (a[left] < a[mid]) {if (a[mid] < a[right]) {return mid;}else if (a[left] > a[right]) {return left;}else {return right;}}else {if (a[mid] > a[right]) {return mid;}else if (a[left] < a[right]) {return left;}else {return right;}}
}、int partition2(int* a, int left, int right) {//给你挖个坑你就往里跳法int mid = GetMindIndex(a, left, right);int key = a[left];swap(key, a[mid]);while (left < right) {while (left < right && a[right] >= key) {--right;}a[left] = a[right];while (left < right && a[left] <= key) {++left;}a[right] = a[left];}a[left] = key;return left;
}void QuickSort(int* a, int left, int right) {//正常的快速排序if (left >= right)return;int mid = partition2(a, left, right);QuickSort(a, left, mid - 1);QuickSort(a, mid + 1, right);}
7.归并排序
void _MerageSort(int* a, int* tmp , int left, int right) {if (left >= right)return;int mid = (left + right) >> 1;_MerageSort(a,tmp, left, mid);_MerageSort(a,tmp, mid + 1, right);int begin1 = left;int end1 = mid;int begin2 = mid + 1;int end2 = right;int index = left;while (begin1 <= end1 && begin2 <= end2) {if (a[begin1] < a[begin2]) {tmp[index++] = a[begin1++];}else {tmp[index++] = a[begin2++];}}while (begin1<=end1){tmp[index++] = a[begin1++];}while (begin2 <= end2) {tmp[index++] = a[begin2++];}for (int i = left; i <= right; i++) {a[i] = tmp[i];}}
void MerageSort(int* a, int n) {int* tmp = new int[n];_MerageSort(a, tmp, 0, n - 1);
delete[] tmp;}
三、排序时间、空间复杂度总结
声明:本图片非自行制作,参考其他博主。