快速排序

/*
	恩,重头戏开始了,快速排序是各种笔试面试最爱考的排序算法之一,
	且排序思想在很多算法题里面被广泛使用。是需要重点掌握的排序算法。
	
	其基本思想是基本思想是,通过一趟排序将待排记录分隔成独立的两部分,
	其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分
	记录继续进行排序,以达到整个序列有序。
	
	1、从数列中挑出一个元素,称为 "基准"(pivot),
    2、重新排序数列,所有元素比基准值小的摆放在基准前面,
		所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
		在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
    3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
    
    下面是随机数作为基准的版本
	//使用引用,完成两数交换  
void Swap(int& a , int& b)  
{  
	int temp = a;  
	a = b;  
	b = temp;  
}  
//取区间内随机数的函数  
int Rand(int low, int high)  
{  
	int size = hgh - low + 1;  
	return  low + rand()%size;   
}  
    //快排的partition算法,这里的基准数是随机选取的  
int RandPartition(int* data, int low , int high)  
{      
	swap(data[rand(low,high)], data[low]);//  
	int key = data[low];  
	int i = low;  
	for(int j=low+1; j<=high; j++)  
	{  
		if(data[j]<=key)  
		{  
			i = i+1;  
			swap(data[i], data[j]);  
		}              
	}   
	swap(data[i],data[low]);  
	return i;  
}  
//递归完成快速排序  
void QuickSort(int* data, int low, int high)  
{  
	if(low<high)  
	{  
		int k = RandPartition(data,low,high);  
		QuickSort(data,low,k-1);  
		QuickSort(data,k+1,high);  
	}  
}   
*/
#include<stdio.h>
int index = 1;
void print(int *a){
	int i;
	for(i = 0; i < 7;i++){
		printf("%d ",a[i]);
	}
	printf("%d\n",a[i]);
} 
void quickSort(int *a,int left,int right){
	int i,j,pivot; 
	if(left < right){
		i = left;
		j = right;		//i,j左右边界赋值 
		pivot = a[i];	//准备以本次最左边的元素值为标准进行划分,先保存其值   
		while(i != j){			//我们知道快排是把左边界增大 右边界减小 相遇的时候则排序一趟完毕 
			while(a[j] > pivot && i<j )//从右向左找第1个小于标准值的位置j 
				j--; 
			if(i<j){   			//找到了,位置为j
        		a[i] = a[j];  	//将第j个元素置于左端并重置i i++					 
        		i++;  
      		}
      		while(a[i] < pivot && i<j)  
        		i++;      //从左向右找第1个大于标准值的位置i  
      		if(i<j){                       //找到了,位置为i   
        		a[j] = a[i];  //将第i个元素置于右端并重置j  j--
        		j--;
      		}     
		}
	    a[i] = pivot;         //将标准值放入它的最终位置,本次划分结束
		printf("第 %d 趟排序:",index++);
		print(a);
	    quickSort(a, left, i-1);     //对标准值左半部递归调用本函数  
	    quickSort(a, i+1, right);    //对标准值右半部递归调用本函数  
    } 
} //排序出了点问题 
//正常的基准 
int main(){
	int left,right;//左右边界下标 int值基准 
	int a[8] ={45, 95, 15, 78, 84, 51, 24, 12};
	left = 0;
	right = 7;
	printf("原序列:");
	print(a);
	quickSort(a,left,right);
	printf("排序后元素如下:");
	print(a);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值