排序算法之——快速排序 C语言实现

一 、快速排序的思路:

	1 从源数组里面选择一个数 v 作为对比
	2 i 从左边开始遍历,直到找到一个比 v 大的数
	3 j 从右边开始遍历,直到找到一个比 v 小的数,或者遍历到最左边跳出循环
	4 交换两个位置 i 和 j 的数,回到步骤2
	5 交换 位置 i 和 v 的数

二、代码:

#include <stdio.h>
void swap(int * a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int partition(int a[], int l, int r)
{
	int i = l - 1, j = r, v = a[r];
	for (;;)
	{
		while (a[++i] < v);
		while (a[--j] > v) if (j == l) break;
		if (i >= j) break;
		swap(&a[i], &a[j]);
	}
	swap(&a[i], &a[r]);
	return i;
}

void quik_sort(int a[], int l, int r)
{
	if (l >= r) return;
	int i = partition(a, l, r);
	quik_sort(a, l, i - 1);
	quik_sort(a, i + 1, r);
}

int main()
{
	int arr[] = { 8,36,23,2,17,6 };
	int N = sizeof(arr) / sizeof(int), i = 0;
	for (i = 0; i < N; ++i) {
		printf("%d ", arr[i]);
	}
	printf("\n");
	quik_sort(arr, 0, N - 1);
	for (i = 0; i < N; ++i) {
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

三、程序执行流程:

在这里插入图片描述
执行流程图

箭头方向是程序流顺序,从位置上看,垂直同一列中的调用属于同一个函数内的调用。

快速排序的复杂度:

时间复杂度:
 - 平均情况:O(nlogn)
 - 最好情况:O(nlogn)
 - 最坏情况:O(n²)

空间复杂度:

 - 辅助空间:O(nlogn)

稳定性:不稳定​

稳定性的意思是,对于一组输入,相同值的元素的位置,排序前后有变化则是不稳定,没变化即是稳定。

比如个数组a:2,12,9,9,11
快速排序过程:
1> 左边找到12 比 11大,右边找到9比11小,交换9和12
2> 11和12 交换,完成。
注意观察,原来 a[3]位置的9最终到了 a[1], a[2]位置的9还是a[2],这样原来的相对位置就改变了,这种情况下就说它不稳定。

这个是递归形式的写法,还有非递归形式的。

*注: 个人笔记只用,如果不妥,还望不吝赐教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值