快速排序:冒泡排序的升级版
基本思想:
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
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;
}
运行结果: