c语言从大到小快速排序算法(c语言完整的快速排序算法)

技术C语言如何实现快速排序算法这篇文章将为大家详细讲解有关C语言如何实现快速排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码#define _CRT_SECURE_NO_W

本文将详细说明如何用C语言实现快速排序。边肖觉得挺实用的,就分享给大家参考。希望你看完这篇文章能有所收获。

密码

#定义_阴极射线管_安全_否_警告1

//快速排序,递归求解

# includestdio.h

voidswap(int*a,int*b)

{

intc=0;

c=* a;

* a=* b;

* b=c;

}

无效比较(intarr,intone,意愿)

{

int first=1;//最左边数组的索引

intlast=end//右数组下标

intkey=first//用于比较的标量(选择第一个最左边的元素)

if(第一个=最后一个)

{

返回;

}

while(第一个最后一个)

{

while(first startarr[last]=arr[key])//找一个比右边标量小的数字。

{

最后-;

}

while(first startarr[first]=arr[key])//在左边找到一个大于标量的数字。

{

首先;

}

If(firstlast)//分析交易所发现的价值。

交换(arr[first],arr[last]);

}

if(first==last)

{

intmite=key//将标量切换到应该去的位置,重新选择标量。

交换(arr[mite],arr[last]);

}

比较(arr,1,first-1);//左侧递归排序

比较(arr,前1,结束);//右侧的递归排序

}

intmain()

{

intar[]={ 5,4,6,5,2,1 };

inti=0;

int len=sizeof(arr)/4;

比较(arr,I,len-1);//传递第一个和最后一个元素的下标

for(I=0;伊琳;(一)

{

printf('%d ',arr[I]);

}

返回0;

}首先,什么是快速排序:快速排序是Tony Hall开发的一种排序算法。平均来说,对n个项目进行排序需要 (nlogn)次比较。在最坏的情况下,需要进行 (N2)比较,但这种情况并不常见。事实上,快速排序通常明显快于其他 (NLOGN)算法,因为其内部循环可以在大多数架构中高效实现。

快速排序最差的情况是O (n),例如序列序列的快速排序。但其平均期望时间为O(nlogn),O(nlogn)符号中隐含的常数因子很小,比复杂度稳定等于O(nlogn)的合并排序小得多。因此,对于大多数弱序的随机序列,快速排序总是优于合并排序。

快速排序使用分治策略将一个列表分成两个子列表。

简单地说,选择一个基准(这里的第一个数据)并与其他数据进行比较,这样较小的数据在它的前面,较大的数据在它的后面。然后将基准分为两部分(比它大的部分和比它小的部分),分别选择两部分的基准,然后进行比较。比较后,分割重复,直到每个部分只有一个数据时排序结束。

图表-

C语言如何实现快速排序算法

00-1010 1.首先,我们需要创建一个数组,数组的第一个数据下标和最后一个数据下标。该数组用于存储数据,然后为快速排序功能创建一个Compare()。最后,我们需要打印出有序的序列。

pre class="brush:cpp;">int main()
{
int arr[] = { 5,4,6,5,2,1};
int i = 0;
int len = sizeof(arr) / 4;
Compare(arr,i,len-1);//传第一个和最后一个元素的下标
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
return 0;

2、Compare()函数创建

这里使用无符号返回类型,因为不需要返回值

为保证数组第一个元素和最后一个元素下标不变,创建first和last两个局部变量记录数组第一个元素和最后一个元素的下标

创建key下标的数据作为基准

void Compare(int arr[], int one, int end)
{
	int first = one;//最左边数组下标
	int last = end;//最右边数组下标
	int key = first;//用于比较的标量(选取最左边第一个元素)

3、首先判断数列是否只有一个元素,如果只有一个元素,则函数结束。

4、开始实现函数主要比较部分

4.1、如果选取左边第一个数据为基准,先从右边开始比较,

4.2、从右边第一个数据开始与key进行比较,如果比它大则继续向右比较(last--),直到找到比key小的数据,便停下来。

4.3、此刻开始从左边开始与key比较,如果比key小则继续比较(first++),如果比key大则与右边找到的比key大的数进行交换。然后右边继续找,重复以上步骤。

4.4、直到first>=last时,都停止寻找,并交换此时first下标的数据与key的值

4.5、分治思想,以此时的key下标的数组作为分界,分为比它大的、比它小的两部分,在重复以上步骤,直至只有一个数据为止,停下排序。采用递归求解。

void Compare(int arr[], int one, int end)
{
	int first = one;//最左边数组下标
	int last = end;//最右边数组下标
	int key = first;//用于比较的标量(选取最左边第一个元素)
	if (first >= last)
	{
		return;
	}
	while (first < last)
	{
		while (first < last && arr[last] >= arr[key])//右边找比标量小的数
		{
			last--;
		}
		while (first < last && arr[first] <= arr[key])//左边找比标量大的数
		{ 
			first++;
		}
		if(first < last)//分析交换找出来的值
		swap(&arr[first], &arr[last]);
	}
	if (first == last)
	{
		int mite = key;//交换标量到它应该到的位置上,重新选取标量
		swap(&arr[mite], &arr[last]);
	}
	Compare(arr,one,first-1);//左边递归排序
	Compare(arr,first+1,end);//右边递归排序
}

swap()交换函数,因为需要影响到交换函数外的值,使用指针形参。

void swap(int* a, int* b)
{
	int c = 0;
	c = *a;
	*a = *b;
	*b = c;
}

关于“C语言如何实现快速排序算法”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153081.html

(0)

相关推荐

  • 泥鳅怎么养,请问各位怎么大量养殖泥鳅

    技术泥鳅怎么养,请问各位怎么大量养殖泥鳅1、专池养鳅泥鳅怎么养:一般为专门从事泥鳅养殖的生产者所采用的养殖方式。池塘以泥底为好,如果是水泥池,则应铺泥土15―20厘米深。池塘面积不宜太大,以一亩左右为宜,每亩可放3―4厘

    生活 2021年10月24日
  • 简谐运动公式,简谐运动周期简单的推导公式

    技术简谐运动公式,简谐运动周期简单的推导公式简谐振动位移公式x=asinωt
    简谐运动恢复力
    f=-kx=-md^2x/dt^2=-mω^2x
    ω^2=k/m
    简谐运动周期公式
    t=2π/ω=2π(m/k)^1/2
    如果

    生活 2021年10月23日
  • Flex布局新旧混合写法分析

    技术Flex布局新旧混合写法分析本篇内容主要讲解“Flex布局新旧混合写法分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Flex布局新旧混合写法分析”吧!旧语法篇定义容器

    攻略 2021年11月15日
  • 数学什么叫因数,小学数学什么是倍数,什么是因数

    技术数学什么叫因数,小学数学什么是倍数,什么是因数①一个整数能够被另一整数整除数学什么叫因数,这个整数就是另一整数的倍数。如15能够被3或5整除,因此15是3的倍数,也是5的倍数。②一个数除以另一数所得的商。如a÷b=c

    生活 2021年10月23日
  • 视觉传播设计与制作,视觉传播设计与制作就业方向

    技术视觉传播设计与制作,视觉传播设计与制作就业方向1首先,你可以选择去设计公司,可以去企业的设计部门工作视觉传播设计与制作。你可以去设计一些企业内部宣传手册,标志和宣传海报等等。2去广告公司也是个不错的选择,你可以在广告

    生活 2021年10月19日
  • ps颜色模式,ps中怎么转换色彩模式

    技术ps颜色模式,ps中怎么转换色彩模式工具/原料电脑Adobe Photoshop CS6(64 Bit)方法/步骤1、首先打开PS,见下图展示ps颜色模式。2、打开PS后,点击菜单栏的文件,打开一张图片,见下图展示。

    生活 2021年10月23日