C++学习 简单排序,冒泡排序,快速排序,二路归并排序算法的递归写法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


简单排序,冒泡排序,快速排序,二路归并排序算法的递归写法。

算法入门


一、使用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);
}

总结

学习算法就要多多实践,这个也是借鉴课本,分享给大家。
参考课本:算法设计与分析,第二版,李春葆,清华大学出版社。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值