- 最流行的的排序算法,速度最快的排序算法(递增顺序)
- 1962年C.A.R.Hoarse发明的快速排序算法
- pivot:枢轴,枢纽(基元素)
- 递归方法
假设有N个元素序列,存放在数组,数组的索引号为1~n:
假设以第一个元素为枢轴元素(参考元素),即pivot=a[1],令两个索引下标 i=1;j=n
- 从序列的最后一个位置,从左往右依次将当前元素的关键字与枢轴元素的关键字进行比较:
如果当前元素的关键字大于或等于枢轴元素,往左边移动;
如果当前元素的关键字小于枢轴元素,将当前位置的关键字s[j]与是s[i]进行交换;(s[i]符合以下情况)
- 同时,从序列的第一个位置,从右往左依次将当前元素的关键字与枢轴元素的关键字进行比较:
如果当前位置元素的关键字小于枢轴元素,往右边移动;
如果当前元素的关键字大于枢轴元素,将当前位置的关键字s[i]与是s[j]进行交换;
直到i>j,退出循环;这样第一轮快速排序完成,枢轴元素变到数组的中间,右边是比它打的元素,左边是比它小的元素
对于右边和左边,使用递归的方法调用快速排序的函数!!
c实现代码如下
#include<stdio.h>
#include<stdlib.h>
void quicksort(int*s, int l, int r);
int main(void)
{
int i;
int k[] = { 8, 6, 4,23, 2, 0, 1, 3, 5, 7,68, 9 };
quicksort(k,0,11);
for (i = 0; i < 12; i++)
printf("%d\t",k[i]);
printf("\n");
system("pause");
return 0;
}
void quicksort(int *s, int l, int r)
{
int i, j, pvoit;
i = l;
j = r;
if (l < r)
{
pvoit = s[i];
while (i < j)
{
while (i<j&&s[j]>pvoit)
j--;
//从右向左来找,第一个小于枢轴元素pvoit的数
if (i < j)
{
s[i] = s[j];
i++;
}
while (i < j&&s[i] < pvoit)
i++;
if (i < j)
{
s[j] = s[i];
j--;
}
//从左向右来找,第一个大于枢轴元素pvoit的数
}
s[i] = pvoit;
//将枢轴元素移动到中间,位于它左边的元素都比它小,位于它右边的值,都比它大
quicksort(s, l, i - 1);
quicksort(s, i + 1, r);
}
}