这次介绍交换排序,交换排序一共有两种排序方法:
1、冒泡排序——稳定的排序方法
2、快速排序——不稳定的排序方法
首先,还是先了解一下交换排序的思想:两两比较待排序记录的关键值,如果不满足要求,进行交换
交换排序的记录仍然存放在顺序表中,存储结构如下:
typedef struct{
int key;//关键字域
}ElemType;
typedef struct{
ElemType r[MAXSIZE+1];//r[0]为监视哨
int length;//顺序表表长
}SqList;
SqList L;
冒泡排序是比较经典的排序方法,每次通过两两比较把最大的元素放到最后。冒泡排序一共进行n-1趟,每趟进行n-i次比较。
下面为冒泡排序的算法:
void BubbleSort(SqList &L)
{
int i,j;
for(i=1;i<L.length;i++)
for(j=1;j<=L.length-i;j++)
{
if(L.r[j].key>L.r[j+1].key)
{
L.r[0]=L.r[j];
L.r[j]=L.r[j+1];
L.r[j+1]=L.r[0];
}
}
}
冒泡排序的时间复杂度和空间复杂度为:
T(n)=O(n^2)
S(n)=O(1)
接下来介绍快速排序。快速排序也用到了low、high、mid,快速排序很容易和折半插入排序弄混。
折半插入排序是先找到合适插入的位置之后low到i-1的元素后移,L.r[low]=L.r[0]。
快速排序是以L.r[1]为枢纽,从high–开始,如果high指向的值比枢纽中记录的关键字小,那么把high指向的元素给low,low++;反之,如果low指向的元素比枢纽中记录的关键字大,把low指向的元素给high,high–。
下面为快速排序的核心算法:
int Patition(SqList &L,int low,int high)
{
int pivotkey;
L.r[0]=L.r[low];
pivotkey=L.r[0].key;
while(low<high)
{
while(L.r[high].key>=pivotkey&&low<high)
high--;
L.r[low]=L.r[high];
while(L.r[low].key<=pivotkey&&low<high)
low++;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
return low;
}
void QuickSort(SqList &L,int low,int high)
{
int pivotloc;
if(low<high)
{
pivotloc=Patition(L,low,high);
QuickSort(L,low,pivotloc-1);
QuickSort(L,pivotloc+1,high);
}
}
void Sort(SqList &L)
{
QuickSort(L,1,L.length);
}
快速排序的时间复杂度和空间复杂度为:
时间复杂度:
最好情况:T(n)=O(nlog2n)
最坏情况:T(n)=O(n^2)
空间复杂度:
S(n)=O(log2n)
交换排序完整的程序如下:
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAXSIZE 20
typedef struct{
int key;
}ElemType;
typedef struct{
ElemType r[MAXSIZE+1];
int length;
}SqList;
SqList L;
void BubbleSort(SqList &L)
{
int i,j;
for(i=1;i<L.length;i++)
for(j=1;j<=L.length-i;j++)
{
if(L.r[j].key>L.r[j+1].key)
{
L.r[0]=L.r[j];
L.r[j]=L.r[j+1];
L.r[j+1]=L.r[0];
}
}
}
int Patition(SqList &L,int low,int high)
{
int pivotkey;
L.r[0]=L.r[low];
pivotkey=L.r[0].key;
while(low<high)
{
while(L.r[high].key>=pivotkey&&low<high)
high--;
L.r[low]=L.r[high];
while(L.r[low].key<=pivotkey&&low<high)
low++;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
return low;
}
void QuickSort(SqList &L,int low,int high)
{
int pivotloc;
if(low<high)
{
pivotloc=Patition(L,low,high);
QuickSort(L,low,pivotloc-1);
QuickSort(L,pivotloc+1,high);
}
}
void Sort(SqList &L)
{
QuickSort(L,1,L.length);
}
int main()
{
int i,output,input=1;
while(input)
{
cout<<"*********************************************************************"<<endl;
cout<<"请输入想要执行命令的序号:"<<endl;
cout<<"0:退出程序"<<endl;
cout<<"1:执行冒泡排序操作"<<endl;
cout<<"2:执行快速排序操作"<<endl;
cout<<"*********************************************************************"<<endl;
cin>>output;
switch(output)
{
case 0:
input=0;
break;
case 1:
cout<<"执行冒泡排序操作"<<endl;
cout<<"请输入顺序表表长:"<<endl;
cin>>L.length;
cout<<"请依次输入顺序表的元素:"<<endl;
for(i=1;i<=L.length;i++)
cin>>L.r[i].key;
BubbleSort(L);
cout<<"执行冒泡排序操作后的结果为:"<<endl;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<" ";
cout<<endl;
break;
case 2:
cout<<"执行快速排序操作"<<endl;
cout<<"请输入顺序表表长:"<<endl;
cin>>L.length;
cout<<"请依次输入顺序表的元素:"<<endl;
for(i=1;i<=L.length;i++)
cin>>L.r[i].key;
Sort(L);
cout<<"执行快速排序操作后的结果为:"<<endl;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<" ";
cout<<endl;
break;
}
}
}
EG:49 38 65 97 76 13 27 49
运行结果如下图所示: