快速排序法(十三)

快速排序法和冒泡排序法有点类似,都是通过交换数据来进行排序,但是快速排序法对冒泡排序法进行了改进,所以效率也就更高。

快速排序法流程:

1、首先对待排序的数据进行分割划界,分界值随便取,关键是要把数据分成两部分;

2、然后将左、右两边的数据同时跟分界值进行比较,把大于分界值的数据放在右边,小于的数据放在左边,如果比较的过程中,有不符合排序标准的数据就行交换,一共就三种情况(a:只有左边不符合,就把不符合的数据与分界值交换;b:只有右边不符合,就把右边的数据与分界值交换;c:如果左右两边都不符合,就把左右两边不符合的数据进行交换),数据较多就一直交换,直到到达分界值(也就是左右两边的数据都跟分界值比较完了);

3、然后把分界值左右两边的数据按上面的方法进行分割比较,不断重复,当左右两边的数据都排好之后,整个排序也就完成了。

假设有N个数字:

1 6 3 2 5 4

第一步:取下标为N/2处的值为分界值,也就是2,然后将2左边的1 6 3以及右边的5 4同时与2进行比较,小的放在左边,大的放在右边;

1 2 3 6 5 4

第二步:2左边只有1,所以将2 3 6 5 4进行分界,6为分界值,同样小的放左边大的放右边;

1 2 3 4 5 6

这里已经排好了,只需要加个判断。

【核心代码】

void QuickSort(int *arr,int left,int right)
{
	int f, t;
	int rtemp, ltemp;

	ltemp = left;//数组第一个
	rtemp = right;//数组最后一个
	f = arr[(left+right)/2];//从中间分开,f为中间值
	while(ltemp<rtemp)//保证至少有两个数,并且
	{
		while (arr[ltemp]<f)//保证arr[ltemp]只能在f的左边
		{
			++ltemp;//此时的arr[ltemp]>f,需要交换
		}
		while (arr[rtemp]>f)//保证arr[rtemp]只能在f的右边
		{
			--rtemp;//此时的arr[rtemp]<f,需要交换
		}
		if (ltemp<=rtemp)//交换位置
		{
			t = arr[ltemp];
			arr[ltemp] = arr[rtemp];
			arr[rtemp] = t;
			--rtemp;
			++ltemp;
		}
	}
	if (ltemp == rtemp)//刚好碰到与分界值交换
	{
		ltemp++;
	}
	if (left<rtemp)
	{
		QuickSort(arr,left,ltemp-1);//无限调用,无限分割
	}
	if (ltemp<right)
	{
		QuickSort(arr, rtemp + 1,right);//无限调用,无限分割
	}
}
【完整代码】

// c++之快速排序算法.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include  <cstdlib>
#include <ctime>

//#define SIZE 18

void QuickSort(int *arr,int left,int right)
{
	int f, t;
	int rtemp, ltemp;

	ltemp = left;//数组第一个
	rtemp = right;//数组最后一个
	f = arr[(left+right)/2];//从中间分开,f为中间值
	while(ltemp<rtemp)//保证至少有两个数,并且
	{
		while (arr[ltemp]<f)//保证arr[ltemp]只能在f的左边
		{
			++ltemp;//此时的arr[ltemp]>f,需要交换
		}
		while (arr[rtemp]>f)//保证arr[rtemp]只能在f的右边
		{
			--rtemp;//此时的arr[rtemp]<f,需要交换
		}
		if (ltemp<=rtemp)//交换位置
		{
			t = arr[ltemp];
			arr[ltemp] = arr[rtemp];
			arr[rtemp] = t;
			--rtemp;
			++ltemp;
		}
	}
	if (ltemp == rtemp)//刚好碰到与分界值交换
	{
		ltemp++;
	}
	if (left<rtemp)
	{
		QuickSort(arr,left,ltemp-1);//无限调用,无限分割
	}
	if (ltemp<right)
	{
		QuickSort(arr, rtemp + 1,right);//无限调用,无限分割
	}
}
int main()
{
	using namespace std;
	int i;
	int SIZE;
	cout << "请输入待排序的数字的个数:";
	cin>>SIZE;
	int *shuzu = new int[SIZE];
	//int shuzu[SIZE];
	srand(time(NULL));
	for (i=0;i<SIZE;i++)
	{
		shuzu[i] = rand() / 1000;
	}

	printf("排序前:\n");
	for (i=0;i<SIZE;i++)
	{
		printf("%d ",shuzu[i]);
	}
	printf("\n");
	QuickSort(shuzu,0,SIZE-1);

	printf("排序后:\n");
	for (i=0;i<SIZE;i++)
	{
		printf("%d ",shuzu[i]);
	}
	printf("\n");
	system("pause");
    return 0;
}

【演示结果】



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值