1.代码实现
#include <stdio.h>
int parttion(int *g,int left,int right)
{
int key = g[left];
while (left < right)
{
while (left < right && g[right] >= key)
{
right--;
}
g[left] = g[right];
while (left < right && g[left] <= key)
{
left++;
}
g[right] = g[left];
}
g[left] = key;
return left;
}
void quicksort(int *g,int left,int right)
{
if (left < right)
{
int pivot = parttion(g,left,right);
quicksort(g,left,pivot-1);
quicksort(g,pivot+1,right);
}
}
void outputarray(int *g,int size)
{
for (int i = 0;i < size;i++)
{
printf("%d ",g[i]);
}
printf("\n");
}
int main()
{
int arr[1000] = {0};
int i = 0;
int n = 0;
printf("num size: ");
scanf("%d\n",&n);
for (int i = 0 ; i < n;i++)
{
scanf("%d",&arr[i]);
}
quicksort(arr,0,n-1);
outputarray(arr,n);
}
2.思路总结
1.在待排序序列中,随便找个数,将比这个数大的数都放在这个数的右边,将比这个数小的数都放在这个数的左边。
2.既然是随便一个数,则我们出于排序的目的,自然从待排序序列中的第一个数开始进行快速排序。
3.每进行一次快速排序,就将一个序列变成三部分,即{小于(等于)x的数的集合,数x,大于(等于)数的集合}
4.一定要搞清楚,3中的序列三部分,只能得到A<B<C,而不是A~C都是有序序列,所以我们需要对A,C这两部分再次进行排序。
5.由3得到{A,B,C}三部分组成的"大体有序"的序列,所以我们只需要再分别对A、C两部分进行排序。
6.同样的排序过程,则递归执行,指代每个大部分被分割成无数的小部分,直至每一个“部分”只由一个数构成,那么我们的排序也就结束了。
3.新的理解方式
如果不好理解,就用**“学生按照身高来排队的模型”**
一开始,班级随机排队,小明在队伍中的某个位置(在快速排序中,我们一般指定该位置为第一个元素的位置0)
,小明离开自己的位置,从最后的位置开始查找一个比自己矮的同学,找到后让它站在自己的位置,然后又从第一个同学查找,找到一个比自己高的同学,让它站到刚才离队的那个同学的位置。
就这样重复这两个步骤,直到再也不能从后排找到比自己矮的同学,再也不能从前排找到比自己高的同学,那么小明,就占据空出来的位置,从而这个位置前的同学一定比小明矮(<=),这个位置后面的同学一定比小明高(>=)
4.时间空间复杂度分析
快排的最坏运行时间为O(n^2),平均运行时间为O(n logn),最好运行时间O(n logn),且隐含的常数因子很小,能够进行就地排序。