快速排序

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),且隐含的常数因子很小,能够进行就地排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值