欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

快速排序(分治算法)

程序员文章站 2022-03-24 15:43:44
...

步骤
1.每次将序列中的第一个元素作为一个一个基准,
2.在序列的左边找到第一个比基准元素大的值,在序列的右面找到第一个比序列小的值,交换这两个值,使得在这两个值的两边元素分别小于、大于基准元素。继续在序列中寻找,之后再交换,最终实现在某个位置,该元素的值(包括该元素)都比基准元素小,该元素的右面的元素值都比基准元素大。将这个值和基准元素进行交换,实现在基准元素的左边,元素值都比基准元素小,基准元素的右面都比基准元素大。
3.将序列分为三部分:基准元素的左边、基准元素、基准元素的右边。
进行分治。最终实现排序
算法实现:

void quickSort(int data[], int low, int high){
    //判断当前序列中是否有元素
    if (low < high){
        //将序列的两端都戳上指针
        int left = low;
        int right = high-1;
        //将序列的第一个元素作为基准值
        //通过循环实现在某个位置,该位置的左面(包括该位置)都小于基准值,改位置的右面都大于基准值
        while (left < right){
            //通过循环找到序列左面第一个比基准值大的位置
            for (; left < high&&data[left] <= data[low];left++);
            //通过循环找到序列的右面第一个比基准值小的元素
            for (; right > low&&data[right]>data[low];right--);
            if (left < right){
                //说明在当前序列中left和right都找到了符合条件的位置
                //交换data[left]和data[right]的值实现在left的左面元素值都比基准值小,right的右面都比基准值大
                int temp = data[left];
                data[left]=data[right];
                data[right] = temp;
            }
        }
        //通过交换data[low]和datap[right]的值实现在基准值的左面元素都比基准值小,基准值的右面元素都比基准值大
        int temp = data[low];
        data[low] = data[right];
        data[right] = temp;

        //左递归调用
        quickSort(data, low, right);
        //右递归调用
        quickSort(data, right + 1, high);
    }
}

调试:

int main(void){
    int data[8] = { 3, 2, 5, 8, 4, 7, 6, 9 };
    quickSort(data, 0, 8);
    for (int i = 0; i < 8; i++){
        printf("%d ",data[i]);
    }
    return 0;
}

调试结果:
快速排序(分治算法)