数据结构-排序-快速排序


数据结构-排序-快速排序



1.算法思想

  • 快速排序的思想: 从n个记录中选取一个记录(这里选取第一个记录),使得排序码小于它的记录全都放在它的左边,大于它的都放在右边,然后对它的左右两边重复这个过程,直到所有记录都位于正确的位置。
  • 具体做法: 先将第一个记录(记录记为 x )暂存,这样子就空出了第一个位置,这个位置将要放置排序码不大于x的记录,从右到左找到一个排序码不大于x的记录,将它放在第一个位置;然后后面就又有一个空位,我们要放入一个排序码大于x的记录,从左到右找到一个排序码大于的记录,放入后面的空白的位置,循环这个过程,直到两边的下标指向同一个位置时,就将x记录放入这个位置,完成划分,实现x的左边都是小于它的记录,右边都是大于它的记录。
  • 图片来自与菜鸟教程
    在这里插入图片描述

2.算法复杂度

  • 执行时间: O(nlogn)
  • 附加空间: 一个中点储存空间和要考虑递归的空间
  • 是否是稳定的排序方法: 不稳定

3.算法实现

#include "stdio.h"

#define MAXSIZE 10

typedef int keytype;

typedef struct {
	keytype key;
	int other;
}recordtype;

typedef struct {
	int length;
	recordtype r[MAXSIZE + 1];
}table;

void quicksort(table * tab, int left, int right) {
	int i, j;
	i = left;
	j = right;
	if (left<right)
	{
		tab->r[0] = tab->r[i];
		do {
			//从右到左找到第一个排序码比参考记录小的记录,这里取最左边的记录作为参考值
			while (tab->r[0].key < tab->r[j].key&&i < j) j--;
			tab->r[i] = tab->r[j]; //找到这个记录并填充到前面空白的位置上

			//从左到右找到第一个排序码大于参考记录的记录
			while (tab->r[0].key > tab->r[i].key&&i < j) i++;
			tab->r[j] = tab->r[i];//找到这个记录,并填充到后面的空白位置上

		} while (i != j);

		tab->r[i] = tab->r[0];
		quicksort(tab, left, i - 1);
		quicksort(tab, i + 1, right);
	}


}

void inputData(table * tab) {

	printf("please input the length:\n");
	scanf("%d", &tab->length);

	printf("please input the data:");
	for (int i = 1; i <= tab->length; i++)
	{
		scanf("%d", &tab->r[i].key);
	}
	return tab;
}

void show(table * tab) {

	printf("the result data:");

	for (int i = 1; i <= tab->length; i++)
	{
		printf("%d ", tab->r[i].key);
	}
}


void main() {
	table * tab = malloc(sizeof(table));
	inputData(tab);
	quicksort(tab, 1, tab->length);
	show(tab);
}

运行截图
在这里插入图片描述

欢迎大家关注我的博客:breeziness123
转载说明出处

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

坂田民工

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值