数据结构一一快速排序

快速排序:冒泡排序的升级版

基本思想:

       通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。


       查找枢轴值,即从顺序表两端开始向中间扫描,使其所在位置的元素不小于左边所有元素值,并且不大于右边所有元素值,实现代码:

/*交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置*/
/*此时在它之前(后)的记录均不大(小)于它。*/
int Partition(SqList* L,int low,int high)
{
	int pivotkey;
	pivotkey = L->iElem[low]; //用子表的第一个记录做枢轴记录
	while (low<high)  //从表的两端交替向中间扫描
	{
		while (low<high && L->iElem[high]>=pivotkey)
			high--;
		Swap(L,low,high); /*将比枢轴记录小的记录交换到低端*/

		while (low<high && L->iElem[low]<=pivotkey)
			low++;
		Swap(L,low,high); /*将比枢轴记录大的记录交换到高端*/
	}
	return low;
}
分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

/*对顺序表L中的子序列进行L->iElem[low...high]作快速排序*/
void QSort(SqList* L,int low,int high)
{
	int pivot;
	if (low<high)
	{
		pivot = Partition(L,low,high); //将L->iElem[low...high]一分为二,算出枢轴值pivot
		QSort(L,low,pivot-1); //对低子表进行递归排序
		PrintList(*L);
		QSort(L,pivot+1,high);//对高子表进行递归排序
		PrintList(*L);
	}
}
调用实现:

void QuickSort(SqList* L)
{
	QSort(L,0,L->iLength-1);
}
整体代码如下:

#include <iostream>
#include <time.h>
using namespace std;

#define MAX_SIZE 9

typedef struct  
{
	int iElem[MAX_SIZE];
	int iLength;
}SqList;

void PrintList(SqList L)
{
	for (int i=0;i<L.iLength;i++)
	{
		cout<<L.iElem[i]<<" ";
	}
	cout<<endl;
}

void CreateList(SqList* L)  
{  
	int i = 0;  
	L->iLength = 0;
	//srand((unsigned)time(NULL));  
	int iData[MAX_SIZE]={50,10,90,30,70,40,80,60,20};
	for (i=0; i<MAX_SIZE; i++)  
	{  
		//L->iElem[i] = rand()%100;  
		L->iElem[i] = iData[i];
		L->iLength++;  
	}    
	PrintList(*L);
}  

void Swap(SqList* L,int i,int j)
{
	int temp=0;
	temp = L->iElem[i];
	L->iElem[i] = L->iElem[j];
	L->iElem[j] = temp;
}

/*交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置*/
/*此时在它之前(后)的记录均不大(小)于它。*/
int Partition(SqList* L,int low,int high)
{
	int pivotkey;
	pivotkey = L->iElem[low]; //用子表的第一个记录做枢轴记录
	while (low<high)  //从表的两端交替向中间扫描
	{
		while (low<high && L->iElem[high]>=pivotkey)
			high--;
		Swap(L,low,high); /*将比枢轴记录小的记录交换到低端*/

		while (low<high && L->iElem[low]<=pivotkey)
			low++;
		Swap(L,low,high); /*将比枢轴记录大的记录交换到高端*/
	}
	return low;
}

/*对顺序表L中的子序列进行L->iElem[low...high]作快速排序*/
void QSort(SqList* L,int low,int high)
{
	int pivot;
	if (low<high)
	{
		pivot = Partition(L,low,high); //将L->iElem[low...high]一分为二,算出枢轴值pivot
		QSort(L,low,pivot-1); //对低子表进行递归排序
		PrintList(*L);
		QSort(L,pivot+1,high);//对高子表进行递归排序
		PrintList(*L);
	}
}

void QuickSort(SqList* L)
{
	QSort(L,0,L->iLength-1);
}

int main()
{
	SqList L;
	CreateList(&L);
	QuickSort(&L);
	return 0;
}
运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值