算法在面試的時候常常會遇到,是不可避免的,只要你面試,確定得會算法,冒泡、二分這些基礎的算法估計實習的時候纔會被面試到,稍微高級一點的算法快排,通常是畢業生、或者換工做的朋友都會被問到,小猿圈詳細描述一下快排的思想和快排的算法,你們能夠看一下。面試
//排序--快速排序法算法
#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");
}
複製代碼
你們學會了嗎?首先必定要把快排的思想理解透徹,只有思想透徹了,代碼纔會很順手敲出來,要不雖然代碼懂了,估計過兩天就忘了,因此思想很重要,想要了解其餘算法,能夠去小猿圈學一下,全都是免費的視頻資料,但願你們真的能學到!