插入排序和归并排序

插入排序`

/插入排序
#include<stdio.h> 
int main()
{
	int Insert[9]={3,2,5,9,66,19,22,80,-100};
	int i,temp;
	for(i=1;i<9;i++)
	{
		temp =Insert[i];
		if(Insert[i]<Insert[i-1])
		{
			for(int j=i-1;j>=0&&Insert[j]>temp;j--)
			{
				Insert[j+1]=Insert[j];
				Insert[j]=temp;
			}
		}
	}
	for(i=0;i<9;i++)
	{
	printf("%d ",Insert[i]);
}
	printf("\n");
	
}

归并排序

//归并排序
#include<stdio.h>
#include<stdlib.h>
void print_arr(int arr[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
//合并
void merge(int arr[],int tempArr[],int left,int mid,int right)
{
	//标记左半区域第一个未排序的元素
	int l_pos = left; 
	//标记右半区域第一个未排序的元素
	int r_pos = mid+1;
	//临时数组元素的下标
	int pos = left;
	//合并 
	while(l_pos<=mid &&r_pos<=right)
	{
		if(arr[l_pos]<arr[r_pos])
		{
			tempArr[pos++] = arr[l_pos++];
		}
		else 
		tempArr[pos++]=arr[r_pos++];
	}
	//合并左半区域剩余元素 
	while(l_pos<=mid)
	tempArr[pos++]=arr[l_pos++];
	//合并右半区域剩余元素 
	while(r_pos<=right)
	tempArr[pos++]=arr[r_pos++];
	//把临时数组中合并后的元素复制回原来的数组 
	while(left<=right)
	{
		
		arr[left]=tempArr[left];
		left++;
	}
 } 
//归并排序
void msort(int arr[],int tempArr[],int left,int right)
{
	//如果只有一个元素,那么不需要继续划分
	//只有一个元素的区域,本来就是有序的只需要被归并
	if(left<right)
	{
		//找中间点 
		int mid =(left+right)/2;
		//递归划分左半区域 
		msort(arr,tempArr,left,mid);
		//递归划分右半区域 
		msort(arr,tempArr,mid+1,right);
		//合并已经排序部分 
		merge(arr,tempArr,left,mid,right);
	 } 
 } 
//归并排序入口
void merge_sort(int arr[],int n)
{
	//分配一个辅助数组 
	int *tempArr = (int*)malloc (n*sizeof(int)) ;
	if(tempArr) //如果它不等于空,辅助数组分配成功
	{
		msort(arr,tempArr,0,n-1);
		free(tempArr);
	 } 
	 else{
	 	printf("error");
	 }
	 
 } 
 int main()
 {
 	int arr[]={9,5,2,7,12,4,3,1,11};
 	int n=9;
 	print_arr(arr,n);
 	merge_sort(arr,n);
    print_arr(arr,n);
    return 0;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值