快速排序算法讲解及代码(详细)
一、序言
快速排序是一种高效且使用广泛的排序算法,在很多语言的标准库中自带的排序都是快速排序。所以我们也有必要了解快排的原理以及实现方法。
二、快速排序基本思想
算法思想:快速排序实现的重点在于数组的拆分。通常我们将数组的第一个元素作为比较元素,然后将数组中小于比较元素的数放到左边,将大于比较元素的放在右边。 这样我们就将数组拆分成了两部分:小于比较元素的数组和大于比较元素的数组。我们再对这两个数组进行相同的拆分。直到拆分到不能再拆分,数组自然就以升序排列了。
三、具体步骤
①、定义两个变量 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<stdio.h> #include<stdlib.h> #define MAX 10 void display(int arr[],int num){ //遍历数组 int i; for(i = 0;i < num;i++){ printf("%-5d",arr[i]); } printf(" "); 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; }
下一篇:
HashMap解决冲突的四种方法