3秒的你对战“它”有没有胜算——quicksort

目录

1.快排思路

2.分块实现

3.代码实现

1.快排思路

快速排序的基本思路就是选择一个基数.(我们这个基数的选择都是每一组最左边的数)

然后排成:

1.基数左边都是不大于它的,左边都是不小于它的

2.然后左边、右边继续进行这个基本思路

以完成排序作为最后的结束

2.分块实现

以6个数为一个例子吧!

4,2 ,6,3,1,5

第一步:确定一个基数,以每次排序最左边的数为基数。本次是4

第二步:左边(用i表示)从第二个数开始与基数进行比较(遇见比基数大的停止比较),右边(用j表示)从最右边开始与基数进行比较(遇见比基数小的停止比较)

第三步:i,j停止时,它们所对应的值进行交换,直到i,j同时指向同一个值的时候,将这个值与基数进行交换。

接着进行循环这三个步骤,每一次基数的左边进行上面的操作,每一次基数的右边也进行上面的操作。直至排序完成。

3.代码实现

1.创建一个较大一点的数组(用于储存输入的数)和需要排序的个数

这里先创建全局变量,为了减少内存的利用

#include <stdio.h>
int arr[100], n;
int main()
{
	
	return 0;
}

2.输入需要排序的个数和输入一组数

int a;
	scanf("%d", &n);
	for (a = 0; a < n; a++)
	{
		scanf("%d", &arr[a]);
	}

3.排序(核心)(创建函数进行排序)

1)以最左边的值为基数,从最右边的数进行比较,遇到小于或者等于基数的值的时候停止,记下此时该数的下标。然后左边开始查找,遇到大于或者等于基数的值的时候停止,记下此时该数的下标。

一定要从右边开始查找,否则排序错误

比如8 6 11 9,按从左开始的话,会变成 11 6 8 9

while (arr[j] >= arr[temp]&&i<j)
		{
			j--;
		}
		while (arr[i] <= arr[temp] && i < j)
		{
			i++;
		}

2)交换下标所对应的数,当左右下标对应同一个值时,将该值与基数交换(第一次排序完毕)

while (i < j)
	{
		
		while (arr[j] >= arr[temp]&&i<j)
		{
			j--;
		}
		while (arr[i] <= arr[temp] && i < j)
		{
			i++;
		}
		t = arr[i];
		arr[i] = arr[j];
		arr[j] = t;
	}
	t = arr[left];
	arr[left] = arr[i];
	arr[i] = t;

3)用递归的方式不断的进行排序,基数左边,右边都需要用递归,递归结束的条件(左下标大于右下标)

if (i > j)
		return 0;
quicksort(left, i);//左
	quicksort(j+1, right);//右

该排序函数模块

int quicksort(int left,int right)
{
	int temp = left;
	int i = left;
	int j = right - 1;
	int t = 0;
	if (i > j)
		return 0;
	while (i < j)
	{
        //下面比较一定要写等于,因为是从基数开始的必须要跳过基数
		
		while (arr[j] >= arr[temp]&&i<j)
		{
			j--;
		}
		while (arr[i] <= arr[temp] && i < j)
		{
			i++;
		}
		t = arr[i];
		arr[i] = arr[j];
		arr[j] = t;
	}
	t = arr[left];
	arr[left] = arr[i];
	arr[i] = t;
	quicksort(left, i);//左
	quicksort(j+1, right);//右
	return 0;
}

4)打印出来拍好的序列

for (a = 0; a < n; a++)
	{
		printf("%d ", arr[a]);
	}
	printf("\n");

听我讲了这么久,我们已经实现了快速排序

下面看完整的代码

#include <stdio.h>
int arr[100], n;
int quicksort(int left,int right)
{
	int temp = left;
	int i = left;
	int j = right - 1;
	int t = 0;
	if (i > j)
		return 0;
	while (i < j)
	{
		
		while (arr[j] >= arr[temp]&&i<j)
		{
			j--;
		}
		while (arr[i] <= arr[temp] && i < j)
		{
			i++;
		}
		t = arr[i];
		arr[i] = arr[j];
		arr[j] = t;
	}
	t = arr[left];
	arr[left] = arr[i];
	arr[i] = t;
	quicksort(left, i);//左
	quicksort(j+1, right);//右
	return 0;
}
int main()
{
	int left, right;
	int a;
	scanf("%d", &n);
	for (a = 0; a < n; a++)
	{
		scanf("%d", &arr[a]);
	}
	left = 0;
	right = n;
	quicksort(left,right);
	for (a = 0; a < n; a++)
	{
		printf("%d ", arr[a]);
	}
	printf("\n");
	return 0;
}

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

easy_understand-ML

你的支持是对我创作的肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值