数据结构-常见10种排序算法及对比

数据结构-常见10种排序算法及对比

一、对比

二、排序算法

1.冒泡排序
/* ----------------------------------------------------------------------------------
	for: 数据结构 之 排序 - 冒泡排序
	anuthor:BinHeon https://blog.csdn.net/BinHeon
	date:   2020/09/14
	tips:
   ---------------------------------------------------------------------------------- */
#include <iostream>  // 标准输入输出流
using namespace std; // 标准命名
// -----------------------------------   全局参数   ---------------------------------
// -----------------------------------     函数     ---------------------------------
//------------------ 1. //innum 需要排序的数据;len 数据个数; order 排序:0升序,1降序
int* bubbleSort(int innum[],int len,int order)
{
	for (int i = 0;i < len-1;i++) { // 冒泡排序,需要进行len趟冒泡
		for (int j = 0;j < len-1;j++) { // 进行一次冒泡,对innum中所有的数值进行比较
			if ((innum[j] > innum[j + 1])&&(0==order)) { // 连续两个数之间比较,将值更大的往后替换 // 正序
				int tran = innum[j + 1];
				innum[j + 1] = innum[j];
				innum[j] = tran;
			}
			else if ((innum[j] < innum[j + 1])&&(1==order)) { // 连续两个数之间比较,将值更小的往后替换 // 逆序
				int tran = innum[j + 1];
				innum[j + 1] = innum[j];
				innum[j] = tran;		
			}
		}
	}
	return innum;
}
// -----------------------------------     main     ---------------------------------
int main()
{
	int num1[] = { 4,3,5,1,0,45,30,20,34,55,70,7 };
	int num2[] = { 10,4,5,9,0,45,30,20,34,55,88,7,90,120,1,2 };
	int len1 = sizeof(num1)/ sizeof(num1[0]);
	int len2 = sizeof(num2) / sizeof(num2[0]);

	int *sortAscendingorder = bubbleSort(num1, len1, 0); // 正序
	cout << "sortAscendingorder-->  "<< endl;
	for (int i = 0;i < len1;i++)cout << sortAscendingorder[i]<<" ";
	cout << endl;

	int* sortDescendingorder = bubbleSort(num2, len2, 1); // 逆序
	cout << "sortDescendingorder-->  " << endl;
	for (int i = 0;i < len2;i++)cout << sortDescendingorder[i]<<" ";
	cout << endl;
}

2.快速排序
/* ----------------------------------------------------------------------------------
	for: 数据结构 之 排序 - 快速排序
	anuthor:BinHeon https://blog.csdn.net/BinHeon
	date:   2020/10/20
	tips:
   ---------------------------------------------------------------------------------- */
#include <iostream>  // 标准输入输出流
using namespace std; // 标准命名
// -----------------------------------   全局参数   ---------------------------------
// -----------------------------------     函数     ---------------------------------
//------------------ 1. //innum 需要排序的数据;left 最左边位置; right 最右边位置
void swap(int* a, int* b) // 交换a,b数据
{
	int tran = *a;
	*a = *b;
	*b = tran;
}
int partitionPosition(int innum[], int left, int right)// 找到中间值位置
{
	int middle = innum[left]; // 选取最左边位置的元素作为中间元素
	int lp = left + 1;  // 初始时,lp指向第二个元素的位置
	int rp = right;     // 初始时,rp指向最右边的位置(即末尾位置)

	while (true) {
		// 采用双指针,将innum中的元素进行交换(除了innum[left]外),
		// 使得middle左边全为小于middle的元素,middle的右边全为大于middle的元素
		while ((lp <= rp) && (innum[lp] <= middle))lp++;// 从头部+1到尾部(从左到右),找到第一个大于middle的元素
		while ((lp <= rp) && (innum[rp] >= middle))rp--;// 从尾部到头部+1(从右到左),找到第一个小于middle的元素
		if (lp >= rp)break;
		// 交换所找到的两个元素
		swap(innum[lp], innum[rp]);
	}
	// 一次调换之后,lp指向的元素为:从左往右,第一个大于/等于middle值的元素;
	//               rp指向的元素为:从左往右,最后一个小于/等于middle值的元素
	// 因此,最终将最后一个小于/等于middle值的元素放到innum[left]处,将middle放到innum[rp]处
	int lastlessMiddle = innum[rp];
	innum[left] = lastlessMiddle; // 将innum中从左往右的最后一个小于/等于middle值的元素放到innum[left]处
	innum[rp] = middle;           // 将middle放到innum[rp]处
	return rp;                    // 返回middle所在位置
}

int* quickSort(int innum[], int left, int right)
{
	if (left < right) {
		int midpos = partitionPosition(innum, left, right);
		innum = quickSort(innum, left, midpos - 1);// 递归排序左侧元素
		innum = quickSort(innum, midpos + 1, right);// 递归排序右侧元素
	}
	return innum;
}
// -----------------------------------     main     ---------------------------------
int main()
{
	int num1[] = { 4,3,5,1,0,45,30,20,34,55,70,7 };
	int num2[] = { 10,4,5,9,0,45,30,20,34,55,88,7,90,120,1,2 };
	int n1 = sizeof(num1) / sizeof(num1[0]);
	int n2 = sizeof(num2) / sizeof(num2[0]);

	int* sortQuick = quickSort(num1, 0, n1 - 1);
	cout << "sortQuick-->  " << endl;
	for (int i = 0;i < n1;i++)cout << sortQuick[i] << " ";
	cout << endl;

	int* sortQuick2 = quickSort(num2, 0, n2 - 1);
	cout << "sortQuick2-->  " << endl;
	for (int i = 0;i < n2;i++)cout << sortQuick2[i] << " ";
	cout << endl;

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值