快速排序通过左右两边各指定一个指针,不断向中间靠拢,如果左边的指针找到比基准点大的,或者右边的指针找到比基准点小的,就把他们交换,基准点一般是数组的第一个的值。
左右指针指向同一个值,就把这个值和基准点交换。我们就找到了基准点本来的的位置;很显然:虽然顺序不对,但他的左边都是比他小的,右边都是比他大的,比如:
4,1,3,6,9,7,8
虽然顺序不对,但注意6这个数字,即使是完全从小到大排列:
1,3,4,6,7,8,9
他还是这个位置。
然后递归调用,慢慢分解,就排序好了。
下边是维基百科的图:

#include <stdio.h>
#include <stdlib.h>
int *a, t;
void fuck(int left, int right)
{
if (left > right)
return;
int temp = a[left];
int i = left;
int j = right;
while (i != j)
{
while (a[j] >= temp && j > i) //必须先从右往左找
j--;
while (a[i] <= temp && j > i)//再从左向右找
i++;
if (i!=j) //当他们没有没有相时就交换吧
{
int k = a[i];
a[i] = a[j];
a[j] = k;
}
}
//找到了那个点,把基准点和i交换
a[left] = a[i];
a[i] = temp;
fuck(left, j - 1); //递归调用,先搞左边的
fuck(j + 1, right); //然后递归右边的
}
int main()
{
int len;
printf("输入需要排序数字的数量\n");
scanf_s("%d", &t);
printf("输入%d个数字吧\n", t);
a = (int*)malloc(sizeof(int)*t);//为a开辟排序数量的内存
for (int i = 0; i < t; i++)
{
scanf_s("%d", &len);
a[i] = len; //循环读入t个数量
}
fuck(0, t - 1); //调用快速排序函数,这是主体。
for (int i = 0; i < t; i++)
printf("%d ", a[i]);
printf("\n");
system("pause");
return 0;
}
本文介绍了一种高效的排序算法——快速排序。通过使用两个指针分别从数组两端开始向中间搜索,将比基准值小的元素放置在左侧,比基准值大的元素放置在右侧。文章详细解释了快速排序的工作原理,并提供了完整的C语言实现代码。
35万+

被折叠的 条评论
为什么被折叠?



