1、冒泡排序
(1)n个记录,总共需要n-1趟,每次挤出一个最大值
(2)第m趟要比较n-m次
改进:添加一个flag用于标记是否发生交换,若某一趟未发生交换,则之后不需要再进行比较
2、快速排序
(1)任选一个元素为中心(pivot)
(2)比它小的往前放,大的往后放——>形成左右两个子表
递归(1)(2),直到每个子表的元素只剩一个
代码:
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int KeyType;
typedef char InfoType;
typedef struct{
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct{
RedType *r;
int length;
}SqList;
//初始化
int Init_Sq(SqList &L){
L.r=new RedType[MAXSIZE];
L.length=0;
return 1;
}
//创建
void Create_Sq(SqList &L,int a[],int n){
for(int i=1;i<=n;i++){
L.r[i].key=a[i-1];
L.length++;
}
}
//显示
void Show_Sq(SqList L){
for(int i=0;i<=L.length;i++) cout<<L.r[i].key<<' ';
cout<<endl;
}
//冒泡排序
//void bubble_sort(SqList &L){
// int m,j;
// int n=L.length;
// RedType x; //临时存储
// for(m=1;m<=n-1;m++){ //n-1趟
// for(j=1;j<=n-m;j++){ //每趟比较n-m次
// if(L.r[j].key>L.r[j+1].key){ //逆序
// x=L.r[j]; L.r[j]=L.r[j+1]; L.r[j+1]=x; //交换
// }
// }
// }
//}
//冒泡排序(改进)
void bubble_sort(SqList &L){
int m,j;
RedType x;
int n=L.length;
int flag=1; //flag作为是否交换的标记
for(m=1;flag==1&&m<=n-1;m++){
flag=0;
for(j=1;j<=n-m;j++){
if(L.r[j].key>L.r[j+1].key){
flag=1;
x=L.r[j]; L.r[j]=L.r[j+1]; L.r[j+1]=x;
}
}
}
}
//快速排序
//找中心点
int Partition(SqList &L,int low,int high){
L.r[0]=L.r[low];
int pivotkey=L.r[0].key; //中心点值
while(low<high){
while(low<high&&L.r[high].key>=pivotkey) --high;
L.r[low]=L.r[high];
while(low<high&&L.r[low].key<=pivotkey) ++low;
L.r[high]=L.r[low];
} //循环结束low==high
L.r[low]=L.r[0]; //存放中心点
return low; //返回中心点位置
}
//快速排序算法
void QSort(SqList &L,int low,int high){
int pivotloc;
if(low<high){ //长度大于1
pivotloc=Partition(L,low,high); //找中心点位置
QSort(L,low,pivotloc-1); //对低子表递归排序
QSort(L,pivotloc+1,high); //对高子表递归排序
}
}
int main(){
SqList L;
int a[]={3,5,10,16,7,32,83,23,54,29,96};
int dlta[]={5,3,1};
Init_Sq(L);
Create_Sq(L,a,11);
cout<<"排序前:";
Show_Sq(L);
bubble_sort(L);
cout<<"冒泡排序后:";
Show_Sq(L);
QSort(L,1,11);
cout<<"快速排序后:";
Show_Sq(L);
return 1;
}