算法 快速排序

思路:以一个数为基准,从它左边找比基数大的数a[i],从它右边找比基数小的数a[j],将两数交换,再继续遍历数组往下找,再用递归来不断缩小区间范围去执行交换。(while循环前提条件是:i<=j)

方法1:

void qsort(int a[], int l, int r)
{
	int i = l, j = r, flag = a[(l + r) / 2];//i定义为哨兵左边left的数组下标
	do                                      //j定义为哨兵右边right的数组下标
	{
		while (a[i] < flag) i++;  //从左边找比哨兵(flag)大的数
		while (a[j] > flag) j--;  //从右边找比哨兵(flag)小的数
		if (i <= j)               //若不符以上两个while,则说明找到左大右小的数
		{                         //此时在i<=j的前提下,去交换a[i]与a[j]
			int t = a[i]; a[i] = a[j]; a[j] = t;
			i++;                  //再继续往下遍历数组去找符合左边比flag大,右边比flag小的数
			j--;
		}
	} while (i <= j);            //为循环的前提,倘若i>j则无意义 返回return
	if ( l< j) qsort(a, l, j);   //不断缩小范围去执行排序
	if (i < r)  qsort(a, i, r);
}

方法二

void qsort(int* a, int begin, int end) {
    if (begin > end)
        return; //表明这种情况无意义
    int tmp = a[begin]; //将基准tmp先赋值为a[begin]
    int i = begin;
    int j = end;
    while (i != j) {   //与法一中含义一样
        while (a[j] >= tmp && j > i)
            j--;
        while (a[i] <= tmp && j > i)
            i++;
        if (j > i) {
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }                 //从循环出来后则表明i=j,说明找到了基准tmp=a[i]=a[j]
    a[begin] = a[i];  //因此结合第四行,交换a[begin]和a[i](此时为基准值)两个的值
    a[i] = tmp;
    qsort(a, begin, i - 1);//再用递归 左区间
    qsort(a, i + 1, end);  //右区间
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值