数据结构与算法 | 快速排序

/*----------------------------------------------------------------------------------------
	
	Program Explain:快速排序
    Create Date:2018.2.10 by lzn

----------------------------------------------------------------------------------------*/
#include <stdio.h>

//函数声明
void swap(int array[], int i, int j);
void QuickSort(int array[], int left, int right);
void PrintfArray(int array[], int len);

/*********************************************************************************
* Function Name    : main主函数
* Parameter		   : NULL
* Return Value     : 0 
* Function Explain : 
* Create Date      : 2018.2.10
**********************************************************************************/
int main(void)
{
	int array[] = {6,2,55,100,33,23,999,888,88};
	int len = sizeof(array)/sizeof(int);
	
	printf("Original array:");
	PrintfArray(array, len);
	QuickSort(array, 0, len-1);
	printf("QuickSort array:");
	PrintfArray(array, len);
	return 0;
}

/*********************************************************************************
* Function Name    : swap,数组内元素交换
* Parameter		   : array:数组  i,j:数组下标
* Return Value     : 0 
* Function Explain : 
* Create Date      : 2018.2.10
**********************************************************************************/
void swap(int array[], int i, int j)
{
	int temp;
	temp = array[i];
	array[i] = array[j];
	array[j] = temp;
}

/*********************************************************************************
* Function Name    : QuickSort,快速排序
* Parameter		   : array:数组  len:数组长度
* Return Value     : 0 
* Function Explain : 
* Create Date      : 2018.2.10
**********************************************************************************/
void QuickSort(int array[], int left, int right)
{
	if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return ;
    }
	int i = left;
	int j = right;
	int key = array[left];	//选择数组第一个元素作为关键数据(枢轴),划分成两个字序列
	
	while(i < j)  /*控制在当组内寻找一遍*/
	{
		/* 升序 */
		while(i < j && key <= array[j]) //把大于key的数据都移到key的右边
		{
			j--;	//向前寻找
		}
		swap(array, i, j);	//“碰头”
		while(i < j && key >= array[i]) //把小于key的数据都移到key的左边
		{
			i++;	//向后寻找
		}
		swap(array, j, i);  //“碰头”
	}
	array[i] = key;				 //当在当组内找完一遍以后就把中间数key回归
	QuickSort(array, left, i-1); //对子序列1(关键数据key左边的序列)进行同样的操作
	QuickSort(array, i+1, right);//对子序列2(关键数据key右边的序列)进行同样的操作
	
}

/*********************************************************************************
* Function Name    : PrintfArray,打印一个数组
* Parameter		   : array:数组  len:数组长度
* Return Value     : 0 
* Function Explain : 
* Create Date      : 2018.2.10
**********************************************************************************/
void PrintfArray(int array[], int len)
{
	for(int i = 0; i < len; i++)
	{
		printf("%d ",array[i]);
	}
	printf("\n");
}

 

程序运行结果如下:

 

参考资料:https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/369842?fr=aladdin&fromid=2084344&fromtitle=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F#3_6

 

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhengnianli

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

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

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

打赏作者

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

抵扣说明:

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

余额充值