C_语言_四大排序(冒泡、选择、插入、快速)

介绍

本文主要介绍四大排序,这四大排序是C语言中最基本的四个:(这是C语言学习的最后一篇)

  • 冒泡排序
    每次排序都从第一个对比到一个最大值并且进行交换放置到最后一位
  • 选择排序
    每次排序都获取到最小值,将最小值放置每次循环的“开始位置”
  • 插入排序
    每次排序都会对比前面所有数字,当匹配到比“当前值小”的“值”先将当前值进行标记位置,然后将当前值进行后移,再将所匹配到的值赋值到当前标记位置
  • 快速排序:(PS:四个算法中最快的一个方法,特殊情况除外)
    1.先进行对比
    2.获取到一个中间值
    3.分成左右两部分(PS:当数组中有比"中间值"大的"值’将分配到右边,反之左边)
    4.将左右两部分在进行递归
    5.重复1->2->3->4步骤递归到只剩下两个值时判断两边大小并交换
    6.结束并返回所有值

源码

#include<stdio.h>
#include<stdlib.h>
//冒泡排序
void Bubble_sort(char crr[],int len)
{
	int temp;//临时变量用于交换
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < Len - 1 - i; j++)
		{
			if (crr[j]>crr[j + 1])
			{
				temp = crr[j];
				crr[j] = crr[j + 1];
				crr[j + 1] = temp;
			}
		}
	}
}
//选择排序
void Selection sort(char crr[], int len)
{
	int tame, k;
	for (int i = 0; i < len - 1; i++)
	{
		k = i;//初始化条件,获取数组下标
		for (int j = i + 1; j < len; j++)//j=i+1为每次前面排好了arr[i]个不用进行二次比较排序
		{
			if (crr[k]>crr[j])//逐次比较k和j;获取最小数字k;
			{
				k = j;
			}
		}
		//最后交换k和i的下标
		tame = crr[i];
		crr[i] = crr[k];
		crr[k] = tame;
	}
}
//插入排序
void insert_sort(char crr[], int len)
{
	int temp;
	for (int i = 1; i < len; i++)//从第二个开始,逐个对比
	{
		for (int j = 0; j < i; j++)//每次从0开始到i次比较
		{
			if (crr[j]>crr[i])//找比arr[i]大的元素到arr[j]
			{
				temp = crr[i];//储存arr[i]到临时变量temp
				for (int k = i - 1; k >= j; k--)//用arr[i+1]=arr[k]遍历比arr[j]大的元素,后移
				{

					crr[k + 1] = crr[k];//前面arr[k]个往后移
				}
				crr[j] = temp;//插入
				break;//跳出循环
			}

		}
	}
}
//快速排序
int part(char arr[], int begin, int end)
{
	int i = begin;//获取从begin开始的第二个值
	int j = end;//从最右边开始第一个数
	int temp;//临时变量,用于交换储存
	while (i < j)
	{
/*******************************
	第一次循环i=0,j=9下标
	第二次循环i=0, j=0下标
*******************************/
		//从右边找到一个比arr[begin+1]小的元素
		while (i<j&&arr[j]>arr[begin])--j;
		//从左边找到一个比arr[begin+1]大的元素
		while (i<j&&arr[i] < arr[begin])++i;
		//交换元素
		temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	//退出了的时候 i==j的时候arr[i]就是要找到的k
	//arr[begin]和arr[i]交换
	temp = arr[begin];
	arr[begin] = arr[i];
	arr[i] = temp;

	return i;
}
void quick_sort(char arr[], int begin, int end)//设置两个开头begin和结尾end
{
	if (begin >= end)return;
	//因为begin必须小于end才排序
	//接下来分成两部分
	//先int k;
	int k = part(arr, begin, end);//接收传递过来的分开的两部分
	//arr[k]左边元素必须小于arr[k]的值,arr[k]右边的元素必须大于arr[k]的值
	//1.排序左边
	quick_sort(arr, begin, k - 1);//由于k不参与排序所以是k-1
	//2.排序右边
	quick_sort(arr, k + 1, end);
}
void main()
{	           
	char crr[10] = { 'e', 'd', 'c', 'i', 'j', 'a', 'g', 'h', 'b', 'f' };
	冒泡排序
	//Bubble_sort(crr, sizeof(crr));
	选择排序
	//Selection_sort(crr, sizeof(crr));
	插入排序
	//insert_sort(crr, sizeof(crr));
	快速排序
	//quick_sort(crr, 0, 9);

	//打印结果
	for (int i = 0; i < sizeof(crr); i++)
	{
		printf("%c", crr[i]);
	}
	printf("\n");
	system("pause");
}

运行结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值