C语言:插入,选择,快速,归并排序

1插入,

你可以想象成给扑克牌排序,别人发给你一堆乱序的牌,现在你要开始玩了,你肯定先摸一张牌作为底牌,再摸一张与上一张作比较,大的话放在右边,小的话上一张往右移一下,待插入的牌放入空位置。当牌多时,待插入的一张牌,依次比较,小,最大的一张右移一个位置,知道有比带插入小的,放入上一个位置。

3 2 8 1 9

3

先 _ 3后把2放进去->2 3;

2 3 8;

1 2 3 8;

1 2 3 8 9;

代码实现:

#include<stdio.h>
int  insert(int a[1000],int n);
int main(){
	int n;
	int a[1000];
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	insert(a,n);
	for(int i=0;i<n;i++){
		printf("%d",a[i]);
	}
	return 0;
} 
int insert(int a[1000],int n)
{
	for(int i=0;i<n-1;i++){
		int end=i;//被作比较的位置 
		int tem=a[end+1];//待插入的牌 
		while(end>=0){
			if(tem<a[end]){//如果成立把当前的位置空出来 
			    a[end+1]=a[end];//大值往后走 
			    end--;//为下一张牌是否比待插入的大 
			} 
			else{
				break;
			} 
			a[end+1]=tem;//空出来的位置 存放待排数 
		}
	}
}
/*为什么没有返回值也可以,因为数组也像是指针交换数值只在数组的地址做的改变不返回原数组也已经排好序了*/

2选择.

选择排序的思想就是选出排好之外数的最大的和最小的放入待定位置,

3 2 8 1 9

9最大9与第一位做交换

9 2 8 1 3

然后8最大与第二位置做交换;

代码呈现:

#include<stdio.h>
void xuanze(int a[],int n);
void swap(int a[],int i,int j);
int main()
{
	int n;
	int a[1000];
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	xuanze(a,n);
	for(int i=0;i<n;i++){
		printf("%d",a[i]);
		if(i!=n-1){
			printf(" ");
		}
	}
	return 0;
 } 
 void xuanze(int a[],int n){
 	int index;
 	for(int i=0;i<n;i++){//待交换的位置
 		index=i;
 		for(int j=i+1;j<n;j++){
 			if(a[j]>a[index]){//判断最大值的下标
 				index=j;
			 }
		 }
		 swap(a,i,index);
	 }
 }
 void swap(int a[],int i,int j){
 	int trem;
 	trem=a[i];
 	a[i]=a[j];
 	a[j]=trem;
 }

3快速,

用的分治思想,像是归类似的,随机选一个数,循环把比他小的放左边比他大的放右边

#include<iostream>
using namespace std;
const int N=100010;
int a[N];
void sort_quick(int a[],int l,int r)
{
	if(l>=r) return;
	int mid=a[l+r>>1];
	int i=l-1,j=r+1;
	while(i<j)
	{
		do i++;  while(a[i]<mid);
		do j--;  while(a[j]>mid);
		if(i<j) swap(a[i],a[j]);
	}
	sort_quick(a,l,j);
	sort_quick(a,j+1,r);
}
int main()
{
	int n;
	cin >> n;
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	
	sort_quick(a,0,n-1);
	
	for(int i=0;i<n;i++) printf("%d ",a[i]);
	return 0;
 } 

 再次调用边界为此数,在他左右分别进行排序逐层交换;直到范围缩为两个一对比;

4归并, 

同样是分治思想但是这是先分后排最后和一起

与快速排序不一样的是分治的先后,快速是边分边排最后直接成型,归并,先分到极致再用双指针排序,最后合并

#include<iostream>
using namespace std;
const int N=100010;
int a[N];
int b[N];
void sort_g(int a[],int l,int r)
{
	if(l>=r) return;
	int mid=l+r>>1;
	int i=l,j=mid+1;//类似于二分,分治 
	sort_g(a,l,mid),sort_g(a,mid+1,r);//先分治后合并,先分到极致,后把已排好的继续排序范围由大及小 
	int k=0;
	while(i<=mid&&j<=r)
	{
		if(a[i]<a[j]) b[k++]=a[i++];
		else b[k++]=a[j++];
	}
	while(i<=mid) b[k++]=a[i++];
	while(j<=r) b[k++]=a[j++];
	for(k=l,j=0;k<=r;k++,j++) a[k]=b[j];
}
int main()
{
	int n;
	cin >> n;
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	
	sort_g(a,0,n-1);
	
	for(int i=0;i<n;i++) printf("%d ",a[i]);
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值