排序——快速排序

基本思想:

    首先,从R[1]~R[n]中任取一个元素,以该元素的排序码为标准把n个元素分成左右两组,即左边一组中所有元素的排序码都不大于标准元素的排序码,右边一组中所有元素的排序码都不小于标准元素的排序码,并将该标准元素放到这两组的中间;然后,用同样的方法分别对这两组元素进行分组,如此反复进行,直到所有元素都被放到正确位置为止。

    一次分组过程:

        用第一个元素为标准进行分组,采用从两端往中间夹入的方式为该元素找插入位置

图示:

    

算法关键步骤:

    1、定义算法partition(int i,int j,int &k),它以R[i]为标准元素,将R[i]~R[j]分成左右两组:R[i]~R[k]中所有元素的排序码都不大于R[k]的排序码,R[k]~R[j]中所有元素的排序码都不小于R[k]的排序码,并返回k值

   2、定义递归算法quickSort(int i,int j):在i<j的情况下,先调用partition(i,j,k),然后递归调用quicksort(i,k-1)和quicksort(k+1,j)。

    3、算法quickSort的初次调用形式为:quickSort(1,n)

代码:

方法一——:

//一次分组
void partition(int i,int j,int &k)
{
  R[0]=R[i]; 
  while(i<j){                             
    while((i<j)&&(R[j].key>=R[0].key)) j--;
    if(i<j) R[i++]=R[j]; 
    while((i<j)&&(R[i].key<=R[0].key)) i++;
    if(i<j) R[j--]=R[i];
  }
  R[i]=R[0];
  k=i;
}
//递归的快速排序算法
void quicksort(int i,int j)
{
  int k;                   
  if(i<j){                           
    partition(i,j,k);         
    quicksort(i,k-1);
    quicksort(k+1,j);
  }
}

//初次调用方式:  quicksort(1,n);

方法二——:

void quicksort(vector<int>& v, int start, int end) {
	if (start>= end)return;
	int temp = v[start], i = start, j = end;
	while (i < j) {
		while (i<j && v[j]>temp)j--;
		if (i >= j)break;
		v[i] = v[j]; i++;
		while (i < j && v[i] < temp)i++;
		if (i >= j)break;
		v[j] = v[i]; j--;
	}
	v[i] = temp;
	quicksort(v, start, i - 1);
	quicksort(v, i + 1, end);
}

注:

    算法的平均执行时间是O(nlog2n),快速排序是不稳定的排序

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值