提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
简单排序,冒泡排序,快速排序,二路归并排序算法的递归写法。
算法入门
一、使用VS2022编辑。
代码如下(示例):
#include<iostream>//该内容来源于WHU,算法设计与分析,李春葆,第二版。侵删。转载请标明原处。
#include<malloc.h>//用递归函数写排序函数
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);
}
总结
学习算法就要多多实践,这个也是借鉴课本,分享给大家。
参考课本:算法设计与分析,第二版,李春葆,清华大学出版社。