C语言之排序

已知从键盘输入10个数,请将它们从小到大排序。

1.交换排序

我的理解:从第一个元素开始,依次与后面所有的元素进行比较,若比第一个元素小,则交换位置。一直循环下去,直到找到最小的元素为止,这样就可以确定第一个元素;同样的道理确定第二、第三、....个位置。

源代码

#include<stdio.h>
int main(){
	int n;
	printf("输入总个数:"); 
	scanf("%d",&n);
	int s[n];
	printf("请输入数据:"); 
	for(int i=0;i<n;i++){
		scanf("%d",&s[i]);
	}
	for(int j=0;j<n-1;j++){//比较次数为总数减1 
		for(int k=j+1;k<n;k++){//比较起点为起点元素的后一个元素 
			if(s[j]>s[k]){
				int temp;
				temp=s[j];
				s[j]=s[k];
				s[k]=temp;
			}
		}
	}
	printf("这些数从小到大的排序为:"); 
	for(int l=0;l<n;l++){
		printf("%d ",s[l]);
	}
	return 0;
}

运行结果:  

2.选择排序

我的理解:从第一个元素开始,依次与后面所有的元素进行比较,若比第一个元素小,则标记该为位置,继续比较标记,直到找到最小位置后,才进行交换,若第一个位置本身就是最小的数,则不必进行交换。同样的,确定第二、第三、第...个的位置也是如此。

源代码

#include<stdio.h>
int main(){
	int n,t;
	printf("输入总个数:"); 
	scanf("%d",&n);
	int s[n];
	printf("请输入数据:"); 
	for(int i=0;i<n;i++){
		scanf("%d",&s[i]);
	}
	for(int j=0;j<n-1;j++){//比较次数为总数减1 
		t=j;
		for(int k=j+1;k<n;k++){//比较起点为起点元素的后一个元素 
			if(s[t]>s[k])
				t=k;
		}
		if(t!=j){//在这里注意交换 是指定位置与标记位置的交换 
			int temp;
			temp=s[t];
			s[t]=s[j];
			s[j]=temp;
		}
	}
	printf("这些数从小到大的排序为:"); 
	for(int l=0;l<n;l++){
		printf("%d ",s[l]);
	}
	return 0;
} 

运行结果:  

3.冒泡排序

我的理解:把n个数进行n-1轮排序,小的数上浮,大的数下沉。

源代码

#include<stdio.h>
int main(){
	int n,t;
	printf("输入总个数:"); 
	scanf("%d",&n);
	int s[n];
	printf("请输入数据:"); 
	for(int i=0;i<n;i++){
		scanf("%d",&s[i]);
	}
	for(int j=0;j<n-1;j++){//比较次数为总数减1 
		for(int k=0;k<n-1-j;k++){//注意1)起始位置为0;2)每次循环次数依次递减,公差为1 
			if(s[k]>s[k+1]){//注意3)是相邻元素的交换 
				int temp;
				temp=s[k+1];
				s[k+1]=s[k];
				s[k]=temp;
			}
		}
	}
	printf("这些数从小到大的排序为:"); 
	for(int l=0;l<n;l++){
		printf("%d ",s[l]);
	}
	return 0;
} 

运行结果:  

4.归并排序

只可意会,不可言传...

源代码

#include<stdio.h>
void gui_bing(int a[],int l,int r,int n){
	if(l>=r)  return;
	
	int mid=l+r>>1;
	gui_bing(a,l,mid,n),gui_bing(a,mid+1,r,n);//不断对半分组,直至单个元素成组 
	
	int i=l,j=mid+1,k=0,tem[n];//tem[n] 数组用来存储临时的数组值 
	while(i<=mid&&j<=r)//&&:and 关系运算符取小于等于 两组两组的合并 小的排前面 
		if(a[i]<a[j])  tem[k++]=a[i++];
		else
			tem[k++]=a[j++];
	
	while(i<=mid)  tem[k++]=a[i++];//取小于等于 mid左边按小到大排序 
	while(j<=r)	  tem[k++]=a[j++];//取小于等于 mid右边按小到大排序 
	
	for(int i=l,j=0;i<=r;i++,j++)  a[i]=tem[j];//最终赋值 
}
int main(){
	int n;
	printf("输入总个数:"); 
	scanf("%d",&n);
	int a[n];
	printf("请输入数据:"); 
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	gui_bing(a,0,n-1,n);
	printf("这些数从小到大的排序为:"); 
	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
	return 0; 
}

运行结果: 

5.快速排序

只可意会,不可言传...

源代码

#include<stdio.h>
void swap(int *p1,int *p2){
	int temp;
	temp=*p1;
	*p1=*p2;
	*p2=temp;
} 
void quick_sort(int a[],int l,int r){//函数要指明类型 
	if(l>=r) return;//递归终止条件不能漏 	
	int i=l-1,j=r+1,x=a[l+r>>1];
	while(i<j){
		do i++;while(a[i]<x);
		do j--;while(a[j]>x);
		if(i<j) swap(&a[i],&a[j]);
	}
	quick_sort(a,l,j),quick_sort(a,j+1,r);
}
int main(){
	int n;
	printf("输入总个数:"); 
	scanf("%d",&n);
	int a[n];
	printf("请输入数据:"); 
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	quick_sort(a,0,n-1);
	printf("这些数从小到大的排序为:"); 
	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
	return 0;
} 

 运行结果: 

ps:第一次写博客,非常仓促,有许多不足的地方请多指教(...轻点喷...) 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值