Quick Sort

Quick Sort


实验结果

输入:需要排列n个数
          需排列数组
输出:已排列数组

在这里插入图片描述


核心代码

int partition(int a[], int left, int right)

首先选择基数,并进行partition分区操作

void quickSort(int a[], int left, int right)

然后进行利用递归分别进行基数左区排序,基数右区排序

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

Partition部分首先从数组尾部进行扫描,找到第一个比基数小的数,然后从数组头部进行扫描,找到第一个比基数大的数

1.	t = a[j];
2.	  a[j] = a[i];
3.	  a[i] = t;

将两个数进行交换

1.	if (i == j)
2.	  {
3.	   break;
4.	  }

直到遍历过整个数组,即i==j,跳出循环

1.	a[left] = a[j];
2.	 a[j] = temp;

将基数与分界位置数字进行交换,这时基数左边数字都比基数小,基数右边数字都比基数大。

int i = partition(a, left, right);

在quick sort部分,获取第一遍分区后基数所在位置

quickSort(a, left, i - 1);

将数组左边区域进行分区操作,即left到i-1区域

quickSort(a, i + 1, right);

将数组右边区域进行分区操作,即i+1到right

问题与解决办法

  1. Partition部分还有多种交换方法可以达到分区的目的,快速排序法的核心在于有基准元素,且每一次排序后,基准元素左右两边,一边比它大一边比它小。

  2. 除代码所用的方法外,常见的partition思路(严书思路)
    在这里插入图片描述

完整代码

#include<stdio.h>

int Partition(int a[], int left, int right) 
{
	int i = left, j = right;
	int temp = a[left];
	int t;
	while (true)
	{
		
		while (a[j] >= temp && j > i) {
			j--;
		}
		while (a[i] <= temp && i < j) {
			i++;
		}
		if (i >= j)
		{
			break;
		}
		t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	a[left] = a[j];
	a[j] = temp;
	return j;
}
void QuickSort(int a[], int left, int right)
{
	if (left < right) {
		int i = Partition(a, left, right);
		QuickSort(a, left, i - 1);	
		QuickSort(a, i + 1, right);
	}
}
int main() {
	int n;
	int a[100];
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &a[i]);
	}
	QuickSort(a, 0, n - 1);
	for (int j = 0; j < n; j++) {
		printf("%d ", a[j]);
	}
	printf("\n");
	return 0;
}

参考:
https://zhuanlan.zhihu.com/p/50652350
https://zhuanlan.zhihu.com/p/63202860

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值