排序

朋友们,这是看完书总结的东西,语句可能不通顺什么的,有地方我还不懂,可能还有错误什么的,望大佬指正。

桶排序

(所用空间大 但是快)
定义很多空间,向其中放入东西。
例子:数据范围在0~1000的数据进行从大到小的排序

#include<stdio.h> 

int main()
{
	int book[1001],i,j,t,n;
	for(i=0;i<=1000;i++)
	    book[i]=0;
    scanf("%d",&n);//输入一个数n,表示接下来有n个数
	for (i=1;i<=n;i++)//循环读入n个数,并进行桶排序
	{
	     scanf("%d",&t);//把每个数读到变量t中
		 book[t]++;  //进行计数,对编号为t的桶放一个小旗子
	}
	for(i=1000;i>=0;i--)//依次判断编号为1000-0的桶
	    for(j=1;j<=book[i];j++)//出现了几次就将桶的编号打印几次
		     printf("%d ",i);
			 
	getchar();getchar();
	//这里我不懂哎 书上说用来暂停程序,以便查看程序输出的内容
	return 0; 
}

冒泡排序

(时间复杂度极大)
每次比较两个相邻元素,如果他们顺序错误就把他们交换
例子:第一行输入排序的个数,第二行输入数字

#include <stdio.h>

int main() {
	
	int a[100], i, j, t, n;
	scanf("%d", &n);   //输入一个数n,表示下面有n个数
	for(i = 1; i <= n; i++) {   //循环读入n个数到数组a中 
		scanf("%d", &a[i]);
	} 
	for(i = 1; i <= n-1; i++) {   //n个数排序,用n-1趟
		for(j = 1; j <= n-1; j++) {  //从第一位开始比较直到最后一个尚未归位的数 
			if(a[j] < a[j+1]) {   //比较大小并交换 
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			} 
		} 
	}
	for(i = 1; i <= n; i++) {     //输出结果 
		printf("%d ", a[i]);
	}
	
	getchar(); getchar(); 
	//注释掉上面这句也行,qwq真不知道他干嘛
	return 0;

}

快速排序

(二分思想)
从两边开始,再找基准点
i,j 两边向中间走,分别寻找大于/小于基准数的数,只到i和j碰头为止
每次将两边的两坨进行排序找基准数。
例子:第一行输入排序的个数,第二行输入数字

#include <stdio.h>

int a[101], n;   //定义全局变量,这两个变量需要在子函数中使用 

void quicksort (int left, int right) {
	int i, j, t, temp;
	if(left > right) {
		return;
	}
    temp = a[left];  //temp内存的就是基准数
	i = left;
	j = right; 
	while(i!=j) {
		//从右向左找
		while(a[j] >= temp && i < j) {
			j--;
		} 
		//从左向右找
		while(a[i] <= temp && i < j) {
			i++;
		} 
		 //交换两个数在数组中的位置
		if(i < j) { //当哨兵i和哨兵j没有相遇时 
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		} 
	}
	//最终将基准数归位
	a[left] = a[i];
	a[i] = temp;
	
	
	quicksort(left, i-1); //继续处理左边的,(一个递归的过程) 
	quicksort(i+1, right); //继续处理右边的
	return; 
} 

int main() {
	int i,j;
	//读入数据;
	scanf("%d", &n); 
	for(i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	quicksort(1,n); 
	
	for(i = 1; i <= n; i++) {
		printf("%d ", a[i]);
	}
	getchar(); getchar();
	return 0;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值