/*3. 编写一个快速排序的算法,并且在main函数中验证其功能已实现
*快速排序(Quick Sort)又称划分交换排序,基本思想:在待排序的n
*个记录中记录中任取一个作为“基准”,将其余记录分为两组,第一组中
*各记录的键值均小于或等于基准的键值,第二组中各记录的键值均大于
*或等于基准的键值,而基准就排在这两组中间(这也是该记录的最终位置),
*这称为一趟快速排序(或一次划分)。对所分成的两组分别重复上述方法,
*直到所有记录都排在适当位置为止。
*快速排序过程实际上是一种“分治法”:通过划分得到两个子区间,对每个子
*区间进行同样出理后,将结果组合起来就是问题的解。
*/
#include<iostream>
using namespace std;
const int maxsize=100; //排序表容量,假设为100
typedef int datatype;
typedef struct
{
datatype key; //关键字
} rectype; //记录类型
typedef rectype list[maxsize+1]; //排序表类型,0号单元不用
//快速排序一次划分算法
int Partition(list R,int p,int q) //对无序区R[p]到R[q]划分,返回划分后基准的位置
{
int i,j;
i=p;
j=q;
R[0]=R[i]; //R[0]作为辅助量x,存放基准,基准取为无序区第一个记录
while(i<j)
{
while(R[j].key>=R[0].key && i<j) j--; //从右向左做扫描
if(R[j].key<R[0].key)
{
R[i]=R[j]; //交换R[i]和R[j]
i++;
}
while(R[i].key<=R[0].key && i<j) i++; //从左想右做扫描
if(R[i].key>R[0].key)
{
R[j]=R[i]; //交换R[i]和R[j]
j--;
}
}
R[i]=R[0]; //将基准移到最后的正确位置
return i;
}
//快速排序主算法
void Quicksort(list R,int s,int t) //对R[s]到R[t]快速排序
{
int i;
if(s>=t) return;
i=Partition(R,s,t);
Quicksort(R,s,i-1);
Quicksort(R,i+1,t);
}
//主函数测试快速排序功能
int main()
{
list R;
const int n=8;
cout<<"come on baby,welcome to my C++ world!!!!"<<endl;
cout<<"please enter the key:"<<endl;
for(int i=1;i<=n;i++) //输入关键字
cin>>R[i].key;
cout<<"input the unsorted keys:"<<endl;
for(int i=1;i<=n;i++) //输出为排序前的序列
cout<<R[i].key<<" ";
cout<<endl;
cout<<"调用快速排序函数!!!"<<endl;
Quicksort(R,1,n); //对整个排序表进行快速排序
cout<<"经过快速排序后的序列:"<<endl;
for(int i=1;i<=n;i++) //输出排序后的序列
cout<<R[i].key<<" ";
system("pause");
return 0;
}
下面给出一次划分的过程:
初始关键字: [49 38 65 97 76 13 27 49']
j向左扫描 ↑ ↑
i ←j
[49 38 65 97 76 13 27 49']
↑ ↑
i j
第一次交换后: [27 38 65 97 76 13 [] 49']
i→ j
[27 38 65 97 76 13 [] 49']
i→ j
第二次交换后: [27 38 [] 97 76 13 65 49']
j向左扫描,位置不变 i ←j
第三次交换后: [27 38 13 97 76 [] 65 49']
i向右扫描,位置不变 i→ j
第四次交换后: [27 38 13 [] 76 97 65 49']
j向左扫描 i ←j
[27 38 13 49 76 97 65 49']
↑↑
基准最后位置 i j
各趟排序之后的状态:
初始关键字: [49 38 65 97 76 13 27 49']
一趟排序后: [27 38 13] 49 [76 97 65 49']
二趟排序后: [13] 27 [38] 49 [49' 65] 76 [97]
三趟排序后: 13 27 38 49 49' [65] 76 97
最后的排序结果:13 27 38 49 49' 65 76 97
*/