c语言必会排序算法一

前言

本人小白,如果有错误请大佬指明 ☆*: .。. o(≧▽≦)o .。.:*☆
多谢江南先生的指导

一.计数排序

它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法。
此处引用网上一张比较经典的图片来展示整个过程:在这里插入图片描述

//计数排序
#include<stdio.h>
int main()
{
	int arr[7] = { 1,3,5,6,4,95,51 };
	//临时数组的大小>=待排序数组最大值+1
	//临时数组初始化各元素要为0
	int newarr[52] = { 0 };
	int i = 0;
	//计算待排序数组的长度
	int a = sizeof(arr) / sizeof(arr[0]);
	//计算临时用于排序数组的长度
	int b = sizeof(newarr) / sizeof(newarr[0]);
	//临时数组数组中名序与待排序数组元素大小对应的元素个数加1
	for (int j = 0;j < a;j++)
	{
		i = arr[j];
		newarr[i]++;
	}
	//临时数组各元素大小为几,就将临时数组名序打印几次
	for (int n = 0;n < b;n++)
	{
		for (int m = 0;m < newarr[n];m++)
		{
			printf("%5d", n);
		}
	}
	return 0;
}

同样缺点也很明显,每次排序都需要更改临时数组的大小,当然也可以将临时数组大小设置的非常大,例如设为101,就可以排序100以内的数字

二.插入排序

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
此处引用网上一张比较经典的gif来展示整个过程:在这里插入图片描述

int main()
{
	int arr[5] = { 1,3,0,9,8 };
	//计算待排序数组的长度
	int len = sizeof(arr) / sizeof(arr[0]);

	//从第一个元素开始排序
	for (int i = 1;i < len;i++)
	{
		//将该元素与前面的各元素相比
		for (int j = i;j > 0;j--)
		{
			if (arr[j - 1] > arr[j])
			{
				int tem = arr[j];
				arr[j] = arr[j - 1];
				arr[j - 1] = tem;
			}
			//前面的各元素都是排序好的,不符合条件就可以直接跳出
			else break;
		}

	}
	for (int n = 0;n < len;n++)
		printf("%5d", arr[n]);
	return 0;
}

三.希尔排序

它与插入排序的不同之处在于,它会优先比较距离较远的元素。
此处引用网上一张比较经典的gif来展示选择排序的整个过程:在这里插入图片描述


int main()
{
int nums[5] = { 1, 8 ,7 ,9 ,4};
// 1.计算待排序数组长度
int len = sizeof(nums) / sizeof(nums[0]);

// 2.计算半长
int gap = len / 2;
do {
    //  3.从第一个元素开始依次取出所有用于比较元素
    for (int i = gap; i < len; i++)
    {
        // 4.遍历取出前面元素进行比较
        int j = i;
        while ((j - gap) >= 0)
        {
            // 5.如果前面一个元素大于当前元素,就交换位置
            if (nums[j - gap] > nums[j])
             {
                    nums[j] =nums[j] ^ nums[j-gap];
					nums[j-gap] = nums[j] ^ nums[j-gap];
					nums[j] = nums[j] ^ nums[j-gap];
            }
            else break;
            j--;
        }
    }
    // 每个小数组排序完成, 重新计算半长
    gap /=2;
} while (gap >= 1);
	for (int n = 0;n < len;n++)
		printf("%-5d", nums[n]);
	return 0;
}

四.选择排序

选择排序是一种简单直观的排序算法
此处引用网上一张比较经典的gif来展示整个过程:
在这里插入图片描述

// 选择排序
int main()
{
	int arr[5] = { 9,23,1,56,6 };
	//计算待排序数组的长度
	int len = sizeof(arr) / sizeof(arr[0]);
	//从第一个元素开始排序
	int a, b;
	//临时变量
	for (int i = 0;i < len;i++)
	{
		//将该元素与前面的元素比较排序
		int j = i;
		int tem = arr[i];
		for(j=i;j<len;j++)
		{	
			if (tem >= arr[j])
			{
				tem = arr[j];
				a = j;
			}
		}
		b = arr[i];
		arr[i] = arr[a];
		arr[a] = b;
	}		
			for (int n = 0;n < len;n++)
				printf("%-5d", arr[n]);
			return 0;
}

它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置知道未排序元素个数为0。

五.冒泡排序

冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。

此处引用网上一张比较经典的gif来展示整个过程:
在这里插入图片描述

int main()
{
	int arr[5] = { 9,23,4,56,6 };
	//计算待排序数组的长度
	int len = sizeof(arr) / sizeof(arr[0]);
	//从第一个元素开始排序
	for (int i = 0;i < len-1;i++)
		//多次冒泡
		for (int j = 0;j < len-1-i;j++)
			//将该元素与前面的元素比较排序
			if (arr[j] > arr[j + 1])
			{
				arr[j] = arr[j] ^ arr[j + 1];
				arr[j + 1] = arr[j] ^ arr[j + 1];
				arr[j] = arr[j] ^ arr[j + 1];
			}
	for (int n = 0;n < len;n++)
		printf("%-5d", arr[n]);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值