归并排序 快速排序

归并排序

#include<stdlib.h>
#include<stdio.h>

static void merge(int arr[],int tmpArr[],int lpos,int rpos,int rend){
	
	int lend,start,num,i;
	lend=rpos-1;
	start=lpos;
	num=rend-lpos+1;
	
	while(lpos<=lend && rpos<=rend){
		if(arr[lpos]<arr[rpos])
		  tmpArr[start++]=arr[lpos++];
		else tmpArr[start++]=arr[rpos++];
	}
	while(lpos<=lend)
	  tmpArr[start++]=arr[lpos++];
	while(rpos<=rend)
	  tmpArr[start++]=arr[rpos++];
	
	for(i=0;i<num;i++,rend--)
	  arr[rend]=tmpArr[rend];
	
}

void mSort(int arr[],int tmpArr[],int left,int right){
	if(left<right){
		int center;
		center=(left+right)/2;
		mSort(arr,tmpArr,left,center);
		mSort(arr,tmpArr,center+1,right);
		merge(arr,tmpArr,left,center+1,right);
	}
}

void mergeSort(int arr[],int N){
	int *tmpArr;
	tmpArr=malloc(sizeof(int)*N);
	if(tmpArr==NULL){
		puts("arrange array fail");
		exit(1);
	}
	mSort(arr,tmpArr,0,N-1);
	free(tmpArr);
}

void printArray(int arr[],int N){
	int i;
	for(i=0;i<N;i++)
	  printf("%d\t",arr[i]);
	printf("\n");
}

int main(){
	int array[9]={56,78,33,22,14,156,123,64,634};
	mergeSort(array,9);
	printArray(array,9);
	
	return 0;
}

快速排序

#include<stdlib.h>
#include<stdio.h>

#define cutoff 3

void printArray(int arr[],int N){
	int i;
	for(i=0;i<N;i++)
	  printf("%d\t",arr[i]);
	printf("\n");
}

void insertSort(int A[],int N){
	int i,j;
	for(i=1;i<N;i++){
		int tmp=A[i];
		for(j=i;j>0 && tmp<A[j-1];j--)
		  A[j]=A[j-1];
		A[j]=tmp;
	}
}

static void swap(int *a,int *b){
	int tmp;
	tmp=*a;
	*a=*b;
	*b=tmp;
}

static int median(int arr[],int left,int right){
	
	int center=(left+right)/2;
	if(arr[left] > arr[center])
	  swap(&arr[left],&arr[center]);
	if(arr[left]>arr[right])
	  swap(&arr[left],&arr[right]);
	if(arr[center]>arr[right])
	  swap(&arr[center],&arr[right]); 
	swap(&arr[center],&arr[right-1]) ;
	return arr[right-1];
}


void qSort(int arr[],int left,int right){
	int i,j;
	
	if(left+cutoff<=right){
		int pivot=median(arr,left,right);
		i=left;j=right-1;
		for(; ; ){
			while(pivot>arr[++i]) {}
			while(pivot<arr[--j]) {}
			if(i<j)
			  swap(&arr[i],&arr[j]);
			else break;
		}
		swap(&arr[i],&arr[right-1]);
		qSort(arr,left,i-1);
		qSort(arr,i+1,right);
	}
	else insertSort(arr+left,right-left+1);
	
}



void quickSort(int arr[],int N){
	qSort(arr,0,N-1);
}

int main(){
	int arr[]={89,654,23,54,15,84,96,568,14,26,487,9,4,11,99,0,65,43};
	quickSort(arr,18);
	printArray(arr,18);
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值