栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

文章目录
  • 简单排序,冒泡排序,快速排序,二路归并排序算法的递归写法。
  • 一、使用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);
}

总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993519.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号