快速排序
-
什么是快速排序
快速排序是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行交换,因此每次交换两个相邻记录只能消除一个逆序。而快速排序可以一次交换消除多个逆序。快速排序的思想是在未排序的序列中,选择一个枢纽(一般是表的第一个元素),一次排序之后,把表分成两个子序列,比枢纽记录关键字小的记录在枢纽的左面,比其大的在右面,然后再对两个子表进行快速排序,直至每一个子表只剩一个记录时,排序完成。 -
快速排序的算法步骤
(1)选择待排序表中的第一个记录为枢纽,将枢纽记录暂存在r[0]的位置上。依附两个指针low = 0,hign = L.length-1.
(2)从表的右端向左进行搜索,找到第一个比枢纽关键字小的记录,将其移到low处。
(3)从表的左端向右进行搜索,找到第一个比枢纽关键字大的记录,将其由到high处。
(4)重复(2)和(3),直至low 和high相等为止。此时Low 和high 的位置即为此趟排序的最终位置,原表被分为两个子表。 -
代码实现
#include<iostream>
using namespace std;
#define MAXSIZE 20
typedef int KeyType;
typedef struct
{
KeyType key;//关键字
int other;//其他信息
}RedType;
typedef struct
{
RedType r[MAXSIZE];
int length;
}SqList;
void CreateSqList(SqList& L)
{
cout << "表的长度:";
cin >> L.length;
cout << "表的关键字信息:";
for (int i = 0; i < L.length; i++)
{
cin >> L.r[i].key;
}
}
int Partition(SqList& L, int low, int high)
{
KeyType key = L.r[low].key;//用子表的第一个记录的关键字做枢纽
while (low < high)//从表的两端交替进行扫描
{
while (low < high && L.r[high].key >= key)
{
high--;
}
L.r[low].key = L.r[high].key;//将比枢纽记录小的记录移到低端
while (low < high && L.r[low].key <= key)
{
low++;
}
L.r[high].key = L.r[low].key;//将比枢纽记录大的记录移到高端
}
L.r[low].key = key;//枢纽记录到位,就是说,枢纽位置在分界线上,在其左面的比其小,在其右边的比其大
return low;
}
void QSort(SqList& L, int low, int high)
{
if (low < high)
{
int position = Partition(L, low, high);
QSort(L, low, position - 1);//对子序列进行快速排序,直到子序列长度为1结束
QSort(L, position + 1, high);
}
}
void QuickSort(SqList& L)//对顺序表进行排序
{
QSort(L, 0, L.length-1);
}
void Show(SqList L)
{
for (int i = 0; i < L.length; i++)
{
cout << L.r[i].key << " ";
}
}
int main()
{
SqList L;
CreateSqList(L);
QuickSort(L);
cout << "排好序的表为:";
Show(L);
return 0;
}