数据结构:快速排序,详细代码注释

一、快速排序的概念

快速排序是冒泡排序的优化,也是一种基于交换的排序方式。时间复杂度O(nlogn)

二、基本思想

(1) 通过一趟排序,先将数据分成两部分,其中一部分的数据都比另一部分的数据大或小(每部分数据内部不要求有序),

(2) 对分好的两部分数据再分别进行上述的操作,把每部分数据再分成两部分,依次类推,直到整个数据有序。

三、代码实现 

#include 

//一趟排序
int sort(int* s, int low,int high){
    //选取一个比较的基准,选待排序列中的哪个都可以
    //一般情况下,为了方便写代码,我们都选下标最小的那个
    int flag = s[low];
    while(low < high ){
        while(s[high] > flag && low < high){
            high--;
        }
        if(low < high){
            s[low] = s[high];
            low++;
        }
        while(s[low] < flag && low < high){
            low++;
        }
        if(low < high){
            s[high] = s[low];
            high--;
        }               
    }
    s[low] = flag;
    //return high也可以,因为此时low 和high是相等的 
    return low;
}

//快速排序,递归调用
int quick_sort(int* s, int low,int high){
    if(low < high){
        //递归的出口
        int ret = sort(s,low,high);
        quick_sort(s,0,ret-1);
        quick_sort(s,ret+1,high);
    }
}

int print_arr(int* s){
    int i = 0;
    for(i = 0; i < 10; i++){
        printf("%d ",s[i]);
    }
    printf("\n");
}

int main(int argc, const char *argv[])
{
    //赋值方式1:
    int s[10] = {6, 4, 9, 3, 7, 5, 8, 2, 1, 10};

    //赋值方式2:终端输入
    int s[10] = {0};
    int i = 0;
    for(i = 0;i < 10 ; i++){
        scanf("%d",&s[i]);
    }

    //排序前
    print_arr(s);
    //执行快速排序
    quick_sort(s, 0, 9);
    //排序后
    print_arr(s);                 
    return 0;
}

代码运行结果:

数据结构:快速排序,详细代码注释_第1张图片

 四、代码实现过程总结:

(1) 输入:可以给数组直接赋值10个数,也可以在终端输入想要排序的10个数。

(2) 排序:将下标最小low 的数值作为基准 flag,使用while 遍历数组。

(3) 循环判断:若最大下标high 的数值比基准大,则不进行数值的交换,下标high ++。

(4) 赋值:出现下标high的数值比基准小,将这个high下标的数值赋给low 下标的数值。

(5) 循环判断:再判断low 下标上的数值是否小于基准,若小于则不进行数值交换,low++。

(6) 赋值:出现下标low 的数值比基准大的,将这个数值赋给 high 下标的数值。

(7) 进行完一趟的排序,已经将数组分成两部分。

(8) 这时采用递归的方式进行接下来的排序,直到排序完成。

(9) 输出:遍历数组,打印出排序完的数组。

你可能感兴趣的:(数据结构,排序算法,数据结构,c语言,算法)