排序----快速排序

1、快速排序思想:选取基准元素,将数组分成两个子数组,其中一个数组里面的元素都比基准元素大,而另一个数组元素都比基准元素小。然后递归调用快速排序对这两个子数组进行排序。

代码:

//快速排序
//输入数组a,数组起始位置start(初始值0),结束位置end(初始值n-1)
void QuickSort(int *a,int start,int end)
{
	int i=start,j=end+1;
	int x=a[i],temp;    //起始位置元素作为基准元素
	
	//划分子数组
	do{
		do 
		{
			i++;
		} while (a[i]<x);
		do 
		{
			j--;
		} while (a[j]>x);
		if (i<j)
		{
			temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
	}while(i<j);	
	a[start]=a[j];
	a[j]=x;

	//递归调用快速排序
	if(j-1>start)
		QuickSort(a,start,j-1);
	if(j+1<end)
		QuickSort(a,j+1,end);
}

2、改进的快速排序

        一般快速排序始终取每一个子数组中一个固定的元素作为基准元素,这个基准元素不一定是最佳的。为了保证每个元素都有机会被选作基准元素,所以在改进的快速排序版本中,我们加入随机化的成分,从子数组中随机选择一个元素作为基准元素,然后在进行子数组分割以及递归调用。

代码如下:

#include "stdafx.h"
#include "iostream.h"
#include "string.h"
#include <time.h>
#include <stdlib.h>

//加入随机化的快速排序
//输入数组a,数组起始位置start(初始值0),结束位置end(初始值n-1)
void QuickSort(int *a,int start,int end)
{
	int i=start,j=end+1,temp;
	//随机选取基准元素
	int r=(int)(rand()%1000/1000.0*(end-start))+start;
	temp=a[i];
	a[i]=a[r];
	a[r]=temp;
	int x=a[i];    //起始位置元素作为基准元素
	//划分子数组
	do{
		do 
		{
			i++;
		} while (a[i]<x);
		do 
		{
			j--;
		} while (a[j]>x);
		if (i<j)
		{
			temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
	}while(i<j);	
	a[start]=a[j];
	a[j]=x;

	//递归调用快速排序
	if(j-1>start)
		QuickSort(a,start,j-1);
	if(j+1<end)
		QuickSort(a,j+1,end);
}

int main(int argc, char* argv[])
{
	int a[]={0,23,5,35,32,435,42,75,24,24,12,64,53,31,97,75,324,75,86,9,54,24,235};
	int len=sizeof(a)/sizeof(int);
	QuickSort(a,0,len-1);
	for (int i=0;i<len;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;

	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值