文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 简单排序,冒泡排序,快速排序,二路归并排序算法的递归写法。
- 一、使用VS2022编辑。
- 总结
简单排序,冒泡排序,快速排序,二路归并排序算法的递归写法。
算法入门
一、使用VS2022编辑。
代码如下(示例):
#include//该内容来源于WHU,算法设计与分析,李春葆,第二版。侵删。转载请标明原处。 #include //用递归函数写排序函数 using namespace std; void disp(int a[], int n);//打印数组 void swap(int& x, int& y);//交换两个整数 void selectsort(int a[], int n, int i);//简单选择排序 void bubblesort(int a[], int n, int i);//冒泡排序 void quicksort(int a[], int s, int t);//快速排序的递归写法 void mergesort(int a[], int n);//二路归并排序 void merge(int a[], int low, int mid, int high); void mergepass(int a[], int length, int n); void disp(int a[], int n) {//打印数组 for (int i = 0; i < n; i++) cout << a[i]<<" "; cout << endl; } void swap(int& x, int& y) {//交换两个整数 int tmp = x; x = y; y = tmp; } void selectsort(int a[], int n, int i) {//简单选择排序 int j, k; if (i == n - 1) return;//终止条件 else { k = i; for (j = i + 1; j < n; j++) if (a[j] < a[k]) k = j;//找到i+1到n最小的数 if (k != i) swap(a[i], a[k]);//交换第i位和最小的那位。 selectsort(a, n, i + 1);//依次从i=0到n,归纳完成 } } void bubblesort(int a[], int n, int i) {//冒泡排序 bool exchange; if (i == n - 1) return;//终止条件 else { exchange = false; for(int j=n-1;j>i;j--) if (a[j] < a[j - 1]) {//检查n到i的排序情况,如果有倒序排列,标识为无序序列,交换倒序。 swap(a[j], a[j - 1]); exchange = true; } if (exchange == false) return;//终止条件,如果未标识无序序列,即为顺序序列,终止。 else bubblesort(a, n, i + 1);//依次从i=0到n,归纳完成 } } int partition(int a[], int s, int t) { int i = s, j = t; int tmp = a[s];//记录第i位为标识数,也就是第一位数 while (i != j) { while (j > i && a[j]>=tmp)//从右向左找比标识数小的,放到第i位。 j--; a[i] = a[j]; while (i < j && a[i] <= tmp)//从左向右找比标识数大的,放到第j位。也就是刚才从右往左找的小的位置。 i++; a[j] = a[i]; } a[i] = tmp;//此时相遇位置记录为标识数。可以理解为复杂一点swap函数, return i;//保证了a[i]位左边比a[i]为小,右边比a[i]大 } void quicksort(int a[], int s, int t) { if (s < t) { int i = partition(a, s, t); quicksort(a, s, i - 1);//左边递归 quicksort(a, i + 1, t);//右边递归 } } void merge(int a[], int low, int mid, int high) {//对两个有序数组进行排序 int* tmpa; int i = low, j = mid + 1, k = 0; tmpa = (int * )malloc((high - low + 1) * sizeof(int));//新建一个数组,缓存 while(i<=mid && j<=high) if (a[i] <= a[j]) { tmpa[k] = a[i]; i++; k++; } else { tmpa[k] = a[j]; j++; k++; } while (i <= mid) {//归并剩余部分 tmpa[k] = a[i]; i++; k++; } while (j <= high) { tmpa[k] = a[j]; j++; k++; } for (k = 0, i = low; i <= high; k++, i++) a[i] = tmpa[k]; free(tmpa); } void mergepass(int a[], int length, int n) {//一次二路归并排序 int i; for (i = 0; i + 2 * length - 1 < n; i = i + 2 * length) merge(a, i, i + length - 1, i + 2 * length - 1); if (i + length - 1 < n)//归并余下两个子表 merge(a, i, i + length - 1, n - 1); } void mergesort(int a[], int n) {//二路归并算法 for (int length = 1; length < n; length = 2 * length) { mergepass(a, length, n); } } void main() { int n = 10; int a[] = { 7,5,6,8,9,7,4,3,2,3 }; cout << "排序前:" << endl; disp(a, n); // selectsort(a, n, 0); bubblesort(a, n, 0); // quicksort(a, 0, n-1);//快速排序 // mergesort(a, n); cout << "排序后:" << endl; disp(a, n); }
总结
学习算法就要多多实践,这个也是借鉴课本,分享给大家。
参考课本:算法设计与分析,第二版,李春葆,清华大学出版社。



