小猿圈算法之快排

算法在面試的時候常常會遇到,是不可避免的,只要你面試,確定得會算法,冒泡、二分這些基礎的算法估計實習的時候纔會被面試到,稍微高級一點的算法快排,通常是畢業生、或者換工做的朋友都會被問到,小猿圈詳細描述一下快排的思想和快排的算法,你們能夠看一下。面試

//排序--快速排序法算法

#include<stdio.h>數組

#include<stdlib.h>bash

#include<string.h>ui

#include<time.h>spa

/*code

快速排序視頻

它的基本思想是:經過一趟排序將要排序的數據分割成獨立的兩部分,排序

其中一部分的全部數據都比另一部分的全部數據都要小遞歸

,而後再按此方法對這兩部分數據分別進行快速排序,

整個排序過程能夠遞歸進行,

以此達到整個數據變成有序序列。

快速排序:

第一步:在數據集之中,選擇一個元素做爲"基準"(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");
}
複製代碼

你們學會了嗎?首先必定要把快排的思想理解透徹,只有思想透徹了,代碼纔會很順手敲出來,要不雖然代碼懂了,估計過兩天就忘了,因此思想很重要,想要了解其餘算法,能夠去小猿圈學一下,全都是免費的視頻資料,但願你們真的能學到!

相關文章
相關標籤/搜索