希尔排序算法和快速排序算法

希尔排序源代码如下:

#include <stdio.h>  
//希尔排序 
void shellSort(int a[],int l, int r){  //一次排序同一步长所组成的集合 如a[0],a[5],a[10]... 
	int i,j,h;
	for(h=1;h<=(r-1)/9;h=3*h+1); //设置步长为1,4,13,40,121,...序列 
	for( ; h>0;h/=3)
		for(i=h;i<=r;i++){
			int j = i;int v = a[i];
			while(j>=h && v<a[j-h]){
				a[j] = a[j-h];j-=h;
			}
			a[j] = v;
		} 
} 
main(){
	int b[16] = {10,7,12,25,8,9,11,71,82,90,1,14,99,7,456,1};
	int length = sizeof(b)/sizeof(b[0]);
	shellSort(b,0,length-1);
	int i;
	for(i=0;i<length;i++)
		printf("%d ",b[i]);
} 



快速排序原代码如下:

#include <stdio.h>

//int a[16] = {10,7,12,25,8,9,11,71,82,90,1,14,99,7,456,1};
//快速排序子程序
int findPivot(int a[],int i,int j){
	int firstKey = a[i];
	int k;
	for(k=i+1;k<=j;k++)
		if(a[k]>firstKey)
			return k;
		else if(a[k]<firstKey)
			return i;
	return -1;
}

//快速排序子程序
int partition(int a[],int i,int j,int pivot) {
	int l,r;
	do{
		for(l = i;a[l]<pivot;l++);
		for(r = j;a[r]>=pivot;r--);
		if(l < r){
			int t = a[l]; a[l]=a[r];a[r]=t;
		}
	}while(l<=r);
	return l;
}

//快速排序主程序
void quickSort(int a[],int i,int j){
	int pivot; //划分的基准;
	int k ; //关键字大于等于pivot的记录在序列中的起始下标 
	int pivotIndex;
	pivotIndex = findPivot(a,i,j);
	if(pivotIndex!=-1){ //递归终止条件 
		pivot = a[pivotIndex];
		k = partition(a,i,j,pivot) ;
		quickSort(a,i,k-1);
		quickSort(a,k,j);
	} 
} 

//-----------------以上是快速排序的一种实现-------------------// 

//快速排序 改进版 
void quick_sort(int s[], int l, int r)
{
    if (l < r)
    {
        int i = l, j = r, x = s[l];
        while (i < j)
        {
            while(i < j && s[j] >= x) 
				j--;  
            if(i < j) 
				s[i++] = s[j];
			
            while(i < j && s[i] < x) 
				i++;  
            if(i < j) 
				s[j--] = s[i];
        }
        s[i] = x;
        quick_sort(s, l, i - 1); 
        quick_sort(s, i + 1, r);
    }
}


main(){
	int b[16] = {10,7,12,25,8,9,11,71,82,90,1,14,99,7,456,1};
	int length = sizeof(b)/sizeof(b[0]);
	quickSort(b,0,length-1);
	int i;
	for(i=0;i<length;i++)
		printf("%d ",b[i]);
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值