快速排序算法讲解及代码(详细)

快速排序算法

  • 一、序言
  • 二、快速排序基本思想
  • 三、具体步骤
  • 四、具体代码

一、序言

快速排序是一种高效且使用广泛的排序算法,在很多语言的标准库中自带的排序都是快速排序。所以我们也有必要了解快排的原理以及实现方法。

二、快速排序基本思想

算法思想:快速排序实现的重点在于数组的拆分。通常我们将数组的第一个元素作为比较元素,然后将数组中小于比较元素的数放到左边,将大于比较元素的放在右边。
这样我们就将数组拆分成了两部分:小于比较元素的数组和大于比较元素的数组。我们再对这两个数组进行相同的拆分。直到拆分到不能再拆分,数组自然就以升序排列了。

三、具体步骤

①、定义两个变量 i 和 j分别指向待排序数组的首尾,定义一个临时变量temp存储比较元素的值(一般取第一个元素,一次排序目的就是令temp在序列中寻找一个合适的位置,使temp左侧元素都不超过temp,右侧的元素都大于temp)
②、令 j 不断向左移动,直到找到某一元素A[ j ] <= 该元素,然后将它挪到A[ i ]所在位置(A[ i ]处的元素已经保存在了temp中),j 进入等待状态, 进入③
③、令 i 不断向右移动, 直到某一元素值A[ i ] > 该元素, 将A[ i ]挪到A[ j ]所在位置(原来的元素已经挪到了该去的地方), i 进入等待状态, 进入②
④、②③不断循环,当i 和 j 指向同一个位置时该位置就是temp应该插入的位置,直接插入就行了(原来的元素已经挪到了该去的地方)

现在temp左侧的元素一定不大于它,temp右侧的元素一定大于它,等于说当整个数组全部排好序后temp的位置就在这里

下面进行左边[ 0, temp-1 ] 和 右边[temp+1, n-1]位置元素的排序(传参就是方括号里面的),方法和上面的相同,然后再不断的切割不断地排序,直到某一区间仅有一个元素为止,这就要用到递归了。

四、具体代码

#include
#include

#define MAX 10

void display(int arr[],int num){//遍历数组
    int i;
    for(i = 0;i < num;i++){
        printf("%-5d",arr[i]);
    }
    printf("\n");
    return;
}

void quitarray(int arr[],int low,int high){//快速排序
    if(low < high){
        int i = low;
        int j = high;
        int temp = arr[i];//存放比较值
    

        while(i < j){
            while(i < j && arr[j] >= temp){
                j--;
            }
            if(i < j){
                arr[i] = arr[j];
                i++;
            }

            while(i < j && arr[i] <= temp){
                i++;
            }
            if(i < j){
                arr[j] = arr[i];
                j--;
            }
            arr[i] = temp;
        }

        quitarray(arr,low,j-1);//左边
        quitarray(arr,i+1,high);//右边
    }
}

int main(){

    int arr[MAX] = {13,76,43,9,5,98,100,99,32,14};

    int num = MAX;
    display(arr,num);//没有排序之前数组

    quitarray(arr,0,num - 1);//快速排序
    display(arr,num);//排序完之后的数组
    return 0;
}

你可能感兴趣的:(排序算法)