(萌新必看系列)简单的一些排序

1--桶排序(简易版)

“史上最快最简单的排序”

桶排序,顾名思义就是就是排将不同数据存入相应“木桶”,这里的木桶就就是设立的数组。

输入需要排序的数,将每一个数字对应的数组中的元素加1,最后进行遍历,就可以简单的实现升序或者降序操作。

代码如下:

#include<stdio.h>

int main()
{
	int book[1005]={0};//数组设置要尽可能大,不然会发生越栈
	int n,t;
	printf("输入排序数字数量\n");
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&t);
		book[t]++;
	}


	for(int i=0;i<=1000;i++){
		if(book[i]>0){
		
			for(int j=1;j<=book[i];j++){//正序输出就是升序排列
				printf("%d ",i);
			}
		}
	}
	return 0;
}

理解感悟:

简易桶排序并非是直接对数据进行排序,而是用数组中元素序号来代替数据,利用数组元素储存按照一定顺序,序号排布按照升序来实现对于未知数据的排序

比起排序,更像是一种取巧的输出方法!。

缺点:当遇到跨度较大的数时,太太太浪费空间了!!!譬如2、200001、1000;仅仅只是三个数而已,就需要申请一个巨大的空间来存放数组,而只是用了一点点,缓慢又浪费!

优点:从缺点可以看出,当数字重复度较高,且数值都较小,还比较接近时,适用于此方法;

2--冒泡排序

“好邻居,我们俩换换位置吧!”

关于冒泡排序,同样的,我们还是顾名思义一下子,冒泡冒泡,就可以理解为鱼儿在水底吐泡泡,泡泡从水底上升,当然是以一定的顺序,是大的气泡一次次的往上升!是相邻之间不断变化的关系!

冒泡排序的基本思想是:每次比较相邻的两个元素,如果顺序错误(不是按照我们预想中的话),就交换顺序;

代码如下:

#include<stdio.h>

int main()
{
	printf("请输入需要排序的数字的个数:\n");
	int n;
	scanf("%d",&n);
	int a[1000]={0};//设置数组来储存数据 
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);//输入每一个数字到数组中
	}
	
	for(int i=0;i<n;i++){//第一次遍历,次数是数字的个数
		for(int j=0;j<n-i-1;j++){//第二次遍历,是将大的往后排
			if(a[j]>a[j+1]){
				int swap = a[j];//设置第三个变量,进行临时储存
				a[j] = a[j+1];
				a[j+1] = swap;
			}
		}
	}
	
	for(int i=0;i<n;i++){//简单的遍历输出
		printf("%d ",a[i]);
	}
	return 0;
}

啊,真是一场酣畅淋漓的排序啊!

冒泡排序的重点核心就是双重嵌套循环,不断大(小)的项往后排,越接近最后,进行的操作越少,这是其隐藏的一点。

就是感觉哪里不太对,这要是数字多一点,这个时间复杂度有点太高了吧!(N*N)

3--快速排序

“传说中最常用的排序”

冒泡排序简单是简单,但是当数据量一旦增大,冒泡排序就显得有点鸡肋了;此时就需要我们的主角--快速排序出厂了!

选择排序的核心目的就是找到基准数,通过遍历交换后使得基准数的左边全是比它小的数,右边全是比它大的数;此时,由于基准数的初次分割,两边的数据进行的一定程度的分类(二分法的内涵!!!),随后用同样的方法处理两边的数组(说人话就是不断二分!!!)。

代码如下:

#include<stdio.h>
int a[101]; //全局变量

void quicksort(int left,int right)//传入函数的是序号
{
	int i,j,t,temp;
    /*i,j分别表示从左右开始查找,t是交换元素使用,
    temp是标记元素,是参照!*/
	if(left>right) return ;//由于使用递归,要判断错误
	
	temp = a[left];
	i = left;
	j = right;
	
	while(i!=j)
	{
        //顺序很重要,先要从右往左找
		while(a[j]>=temp&&i<j) j--;
        //再从左往右找
		while(a[i]<=temp&&i<j) i++;
		
		if(i<j){
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	
    
    //当i和j相等时,代表查找到了尽头,此时交换i(j)和标记元素位置
	a[left] = a[i];
	a[i] = temp;
	
    //二分法分出来的位置,使用递归进行同样处理
	quicksort(left,i-1);
	quicksort(i+1,right);
	return ;

}


int main()
{

	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	
	quicksort(1,n);
	
	for(int j=1;j<=n;j++){
		printf("%d ",a[j]);
	}
	return 0;
}

快速排序的核心就在于:找到基准点,利用二分法的思维来对运算时间进行减半!对于其余数字在基准点的两边进行简单的处理,后运用递归处理

4--选择排序

“符合人脑思路的方法”

主要思路:从数列中选择出一个最小值,放在数列最前面,随后在从第二个开始重复进行这一动作。

#include<stdio.h>

int main()
{
	int n,a[100]={0},i;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	
	
	for(int i=0;i<n;i++){//第一次循环
		
		int max = i;//标记元素下标,每一轮的最大值
		for(int j = i;j<n;j++){//第二轮循环,确定最大值
			if(a[j]>a[max]) max = j;
		}
		
        //第二轮循环结束,交换首位元素与最大值
		int temp = a[i];
		a[i] = a[max];
		a[max] = temp;

        //随后开启的又一轮就可以从第二个元素开始遍历
	}
	
	
	for(i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	return 0;
}

选择排序就好比人来挑选一样,每次都找到一个最大(小)的,将它挑选出来放置到数列首(尾),一轮又一轮后完成排序操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值