快速排序算法代码实现

将数组最左边的元素赋值给pivot

left = 1; right = n(数组最后一个元素下标)

要定义两个变量 i = left  j = right  不直接使用left和right 以免丢失原值

此时左边这个数的位置为空出来了,那么从右边找一个比pivot小的数放入, 接着右边右空出来一个位置,那么从左边找一个比pivot大的数让入;

当 i== j 时就是pivot的正确位置把pivot放入,

此时的pivot 前面的元素都是比pivot 小的, pivot后面的元素都是比pivot 大的.

那么把可以把把它分为两半: 左半部分为: [ left , i-1 ]  右半部分为:[ i+1 , right ]

使用递归完成左半部分和右半部分, 一直循环上面的步骤直至排序完成

//快速排序算法;
void QuickSort(int arr[],int left,int right)
{
    int i = left, j = right;   //传入的left 和 right 代表这一趟的范围
    int pivot;
    if (i < j){                //如果当 i == j 时就代表它的右边已经有序了
        int flat = 1;           //flat = 1 时就代表要去右边找一个小的,  flat = 0 时 就要去左边找个大的
        pivot = arr[i];
        while (i != j)         //i != j 时一直循环,从左边找个比pivot 大 的放右边,从右边找个比pivot 小 的放左边
        {   
            if(flat == 1)
            {   if(pivot > arr[j]){
                arr[i] = arr[j];
                i++;  flat = 0;       //已经从右边找了个小的放在左边,此时右边空了,即下次要去左边找,则把flat 改为 0;
                }
                else j--; 
            }
            else{
                if(pivot < arr[i]){
                    arr[j] = arr[i];
                    j--; flat = 1;   //已经从左边找了个大的放在右边,此时左边空了,即下次要去右边找,则把flat 改为 1;
                }
                else i++;
            }
        }
        arr[i] = pivot;
        //反复循环,递归,即把这个范围一直缩小,直至有序
        QuickSort(arr,left,i-1);    //left 到当前pivot位置的左侧
        QuickSort(arr,i+1,right);   //当前pivot位置的右侧到 right
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值