快速排序(分治算法)

来源:互联网 发布:朝鲜绑架 知乎 编辑:程序博客网 时间:2024/06/05 06:49

步骤
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;}

调试结果:
这里写图片描述

原创粉丝点击