一、主要思想
快速排序的主要思想是分治法,也就是把问题分解成若干个小问题求解,然后把小问题的解合成问题的解。快速排序的算法步骤如下;
①从数列中取出一个数作为基准数;
②把所有小于基准数的全部挪到左边,把所有大于基准数的全部挪到右边;
③对基准数左右两部分分别重复步骤①和②。
一次基本步骤的演示过程:
原始数列:
①取第一个数作为基准数,用临时变量x记录下来,x=56
②用i,j分别从数列头和尾遍历数列,初始化时i=start(开始位置),j=end(结束位置)
(如果start >= end 直接return,不再执行以下步骤)
③j开始向左遍历,直到遇到一个比基准数小的数或者遇上i
如果是直到遇到一个比基准数小的数,把j指向的数移动到i指向的地址
i向右移动一位
⑤i向右遍历数列直到遇到一个比基准数大的数或者与j相遇,如果是遇到一个比基准数大的数,把它移动到j指向的地址
j向左移动一位
⑥重复以上步骤,直到i和j相遇,本例中i和j相遇时如下
然后把基准数56挪到i指向的地址中,这样56的最终位置就确定了。
⑦对基准数左边和右边的数列分别递归执行上述步骤,即可完成排序,时间复杂度是O(nlog2n)
二、示例代码
#include <stdio.h>
void sort(int* N,int start,int end){
if(start >= end) return;
int i = start;
int j = end;
int x = N[start];
while(i < j){
while(j > i && N[j] > x) j--;
if(j > i){
N[i] = N[j];
i++;
}
while(j > i && N[i] < x) i++;
if(j > i){
N[j] = N[i];
j--;
}
}
N[i] = x;
if(start < i - 1)
sort(N,start,i - 1);
if(end > i + 1)
sort(N,i + 1,end);
}
int main(int argc, char **argv)
{
int N[6] = {6,5,4,3,2,1};
sort(N,0,5);
for(int i = 0; i < 6; i ++){
printf("%d",N[i]);
if(i != 5) printf(",");
}
return 0;
}
运行结果: