1. 程式人生 > >小猿圈演算法之快排

小猿圈演算法之快排

演算法在面試的時候經常會遇到,是不可避免的,只要你面試,肯定得會演算法,冒泡、二分這些基礎的演算法估計實習的時候才會被面試到,稍微高階一點的演算法快排,一般是畢業生、或者換工作的朋友都會被問到,小猿圈詳細描述一下快排的思想和快排的演算法,大家可以看一下。

//排序--快速排序法

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<time.h>

/*

快速排序

它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,

其中一部分的所有資料都比另外一部分的所有資料都要小

,然後再按此方法對這兩部分資料分別進行快速排序,

整個排序過程可以遞迴進行,

以此達到整個資料變成有序序列。

快速排序:

第一步:在資料集之中,選擇一個元素作為"基準"(pivot)

第二步:所有小於"基準"的元素,都移到"基準"的左邊;所有大於"基準"的元素,都移到"基準"的右邊

第三步:對"基準"左邊和右邊的兩個子集,不斷重複第一步和第二步,直到所有子集只剩下一個元素為止

*/

//位置調換

void MySwap(int *arr,int a,int b){

    int temp = arr[a];

    arr[a] = arr[b];

    arr[b] = temp;

}

//一輪快速排序 single

int SingleSort(int *arr, int low, int high){

    //獲取樞軸

    int pv = arr[low];

    while (low < high){

        //high向左移動

        while (low<high&&arr[high] >= pv){

            high--;

        }

        //此時 high下標的元素的值不大於樞軸  可以調換位置

        MySwap(arr, low, high);

        //注意 此時樞軸的位置在high上  high的值就是Pv

        //low向右移動

        while (low<high&&arr[low]< pv){

            low++;

        }

        //此時 low下標的元素的值大於樞軸  可以調換位置

        MySwap(arr, low, high);

        //注意 此時樞軸的位置在low上  low的值就是Pv

    }

    //返回最終pv所在的位置  此時必定 low==high

    return low;

}

//快速排序

void QuickSort(int *arr, int low, int high){

    if (low >= high)

    {

        return;

    }

    //排序一輪

    int pivot = SingleSort(arr, low, high);

    //排序產生的左陣列

    QuickSort(arr, low, pivot - 1);

    //排序產生的右陣列

    QuickSort(arr, pivot + 1, high);

}

//列印陣列

void Print(int * arr, int num){

    if (arr == NULL)

    {

        printf("傳入引數不可以為空!\n");

        return;

    }

    int i = 0;

    for (int i = 0; i < num; i++)

    {

        printf("%5d", *(arr + i));

    }

    printf("\n");

}

void Test(){

    int i = 0;

    int arr[10] = { 0 };

    //定義時間型別變數

    time_t ts;

    //生成隨機數種子

    srand((unsigned int)time(&ts));

    for (i = 0; i < 10; i++)

    {

        arr[i] = (int)(rand() % 100);

    }

    //列印陣列

    printf("\n原始資料----\n");

    Print(arr, 10);

    //快速排序

    printf("快速排序之後的資料\n");

    QuickSort(arr, 0,9);

    Print(arr, 10);

}

void main(){

    Test();

    system("pause");

}

大家學會了嗎?首先一定要把快排的思想理解透徹,只有思想透徹了,程式碼才會很順手敲出來,要不雖然程式碼懂了,估計過兩天就忘了,所以思想很重要,想要了解其他演算法,可以去小猿圈學一下,全都是免費的視訊資料,希望大