吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4375|回复: 5
收起左侧

[C&C++ 原创] C语言快速排列求打印每一趟结果算法

[复制链接]
luoluoovo 发表于 2019-3-12 15:39
最近在做题,发现老有这种求每一趟结果的题目,于是我就整理了一下,写出来了。
[C] 纯文本查看 复制代码
#include <stdio.h>
#define N 10//待排序个数
typedef int KeyType;//关键字类型定义
typedef struct
{
	KeyType key;

}RecType;
typedef RecType SeqList[N + 1];//顺序表类型
SeqList R = {10,18,4,3,6,12,1,9,18,8};


void QuickSort(SeqList R, int low, int high)//快速排序(两个函数递归)
{
	int pivot;//基准位置
	if (low < high)
	{//位置大于1才需要排序
		pivot = Partition(R, low, high);//调用划分函数
		QuickSort(R, low, pivot-1);//最低和基准位置的排序
		QuickSort(R, pivot + 1, high);//最高和基准位置右边之间的排序
	}
}
int Partition(SeqList R, int i, int j)//划分函数(用于返回基准位置,并排序)
{//1.判断右边是否小于关键字,是的话,R[左指针]=R[右指针]。左指针右移
 //2.判断左边是否大于关键字,是的话,R[右指针]=R[左指针]。右指针左移
 //3.R[左指针]=R[关键字]
	RecType pivot = R[i];//用顺序表的第一个值作为基准位置
	int bool1 = 0;
	if (i < j)
		bool1 = 1;
	while (i < j)//用于左右的标识如果重叠时结束循环
	{
		while (i < j&&R[j].key >= pivot.key)//判断右边的值是否大于等于基准位置的值
		{
			j--;//是的话,右标识左移,直到右边比关键字小或等于,或者左右标识重叠为止
		}
		if (i < j)
		{
			R[i++] = R[j];//找到的话,左边的数组等于右边数组。然后左标识要右移

		}
			

		while (i < j&&R[i].key <= pivot.key)//判断左边的值是否小于等于基准位置的值
		{
			i++;//是的话,左边标识要右移,直到左边标识的值比基准位置的值小
		}
		if (i < j)

		{
			R[j--] = R[i];

		}
			
	}
	R[i] = pivot;//R[左指针]=R[关键字]
	if (bool1)
	{
		printf("---------------------------\n");
		for (int z = 0; z <= N-1; z++)
			if(z==i)
				printf("[%d],", R[z]);
			else
				printf("%d,", R[z]);
		printf("\n");
	}
	

	return i;
}

void main() {
	QuickSort(R, 0, N-1);
	getchar();
}
截图1552376255.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Jorge 发表于 2019-3-12 16:25
虽然这类代码网上挺多的,但是毕竟这个说是楼主原创,支持一下,加油!
y07240916 发表于 2019-3-12 16:47
yoplore_zhao 发表于 2019-3-13 15:14
zy2020 发表于 2019-3-13 16:02
学习了,不错
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 05:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表