算法在面试的时候常常会遇到,是不可避免的,只要你面试,确定得会算法,冒泡、二分这些基础的算法估计实习的时候才会被面试到,稍微高级一点的算法快排,通常是毕业生、或者换工做的朋友都会被问到,小猿圈详细描述一下快排的思想和快排的算法,你们能够看一下。面试
//排序--快速排序法算法
#include<stdio.h>数组
#include<stdlib.h>ui
#include<string.h>code
#include<time.h>视频
/*排序
快速排序递归
它的基本思想是:经过一趟排序将要排序的数据分割成独立的两部分,get
其中一部分的全部数据都比另一部分的全部数据都要小string
,而后再按此方法对这两部分数据分别进行快速排序,
整个排序过程能够递归进行,
以此达到整个数据变成有序序列。
快速排序:
第一步:在数据集之中,选择一个元素做为"基准"(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"); }
你们学会了吗?首先必定要把快排的思想理解透彻,只有思想透彻了,代码才会很顺手敲出来,要不虽然代码懂了,估计过两天就忘了,因此思想很重要,想要了解其余算法,能够去小猿圈学一下,全都是免费的视频资料,但愿你们真的能学到!