几大经典排序算法

本文详细介绍了几种常见的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序和归并排序。通过代码实现和注释解释,帮助读者深入理解每种排序算法的工作原理。冒泡排序通过相邻元素比较交换实现排序;选择排序每次找到最小元素放到正确位置;插入排序则是将元素依次插入到已排序部分;希尔排序通过增量序列改进插入排序效率;归并排序利用分治策略,将序列分为两半分别排序后再合并。这些排序算法各有特点,适用于不同场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述
掌握其中几个就行,熟烂于心,比如快排,希尔排序

冒泡排序

转到冒泡排序详解

选择排序

转到选择排序讲解

插入排序

转到插入排序讲解

希尔排序

转到希尔排序讲解
对代码加了一些注释,便于自己理解

void shellsort2(int a[], int n)
{
	int j,gap;
	for(gap=n/2;gap>0;gap/=2;){//步长的变化 
		for(j=gap;j<n;j++){//每个元素与自己组内的数据进行直接插入排序
			if(a[j]<a[j-gap]){//如果当前元素小于前面的元素 
				int temp=a[j];//保存当前这个较小的数 
				int k=j-gap;//用于向前查找 
				while(k>=0&&a[k]>temp){//如果当前这个位置上的数比temp还大 
					a[k+gap]=a[k];//用这个数覆盖后面的 
					k-=gap;//继续向前查找 
				} 
				//退出了循环,此时k位置上的数比temp小,应该将temp放在其后面 
				a[k+gap]=temp;
			}
		}
	}
}

归并排序

转到归并排序讲解
对其中的代码加了注释,便于理解

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void merge(int a[], int l, int r, int mid)
{
	int* aux = new int[r - l + 1]; int i, j, k;
	//aux为开辟出来的存储空
	for (k = l; k <= r; k++)
		aux[k - l] = a[k];
	//将a中的元素逐个复制到aux中,将来a存储最后的序列
	i = l;//i为左子序列的哨兵
	j = mid + 1;//j为右子序列的哨兵
	for (k = l; k <= r; k++)
	{//开始从左边像右边进行遍历,k为新开数组的最左边的位置,即新数组的哨兵
		if (i > mid)
		{//当左哨兵越过了中间线,代表左边的元素全部插入到了aux中
			//开始将右边剩余的元素全部插入到aux中
			a[k] = aux[j - l];
			j++;//右哨兵持续向右移动
		}
		else if (j > r)
		{//当右哨兵越过了右边的界限,代表右边的元素全部插入到了aux中
			//开始将左边剩余的元素全部插入到aux中
			a[k] = aux[i - l];
			i++;//左哨兵持续向右移动
		}
		else if (aux[i - l] > aux[j - l])
		{//如果左哨兵上的元素是大于右哨兵上的元素,将右边的元素插入
			a[k] = aux[j - l];
			j++;//右哨兵向右移动一格
		}
		else
		{//如果左哨兵上的元素是小于右哨兵上的元素,将左边的元素插入
			a[k] = aux[i - l];
			i++;//左哨兵向右移动一格
		}
	}
}
void merge_sort(int a[], int l, int r)
{
	if (l >= r)//当左边索引不小于右边索引时跳出
		//就是分到每个子序列只有一个元素就不需要再分开始合并
		return;
	int mid = (l + r) / 2;//寻找中间位置
	merge_sort(a, l, mid);//对“分”的左子序列进行处理
	merge_sort(a, mid + 1, r);//对“分”的右子序列进行处理
	merge(a, l, r, mid);//对分的序列进行合并
}
void mergesort(int a[], int l, int r)
{
	merge_sort(a, l, r - 1);//规模减1为右边的下标
}
int main()
{
	int a[105], n, i;
	scanf_s("%d", &n);
	for (i = 0; i < n; i++)
		scanf_s("%d", &a[i]);
	mergesort(a, 0, n);
	for (i = 0; i < n; i++)
		printf("%d ", a[i]);
	return 0;
}

快速排序

转到快速排序讲解

堆排序

就是构造相应的大根堆或者小根堆然后将根结点元素拿掉重复进行即可得到有序序列。
转到堆排序讲解

计数排序

其中对于max-min+1后面的部分可以直接输出count数组中的内容,应该不用再存储到result中
转到计数排序讲解

桶排序

转到桶排序讲解

基数排序

其中桶排序、计数、基数都差不多,掌握思想即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撑一把纸伞.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值