快速排序的基本思想:在待排序表中任取一个元素作为基准,通过一趟排序将待排序表划分为独立的两个部分,使得左边元素都小于基准,右边元素都大于基准。
时间复杂度:log2n
稳定性:不稳定
下面投放快速排序的代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 50
typedef struct{
int data[MaxSize];
int length;
}SeqList;
//创建顺序表
void createTable(SeqList &L){
L.length=5; //用循环方法初始化时,千万要记得给length赋初值
L.data[0] = 3;
L.data[1] = 1;
L.data[2] = 4;
L.data[3] = 2;
L.data[4] = 5;
}
//快速排序
int Partition(SeqList &L,int low,int high){
int pivot = L.data[low]; //将当前表中的第一个元素设置为枢轴值,对表进行划分
while(low < high){ //循环跳出条件
while(low<high && L.data[high]>=pivot)
high--;
L.data[low] = L.data[high]; //将比枢轴值小的元素移动到左端
while(low<high && L.data[low]<=pivot)
++low;
L.data[high] = L.data[low]; //将比枢轴值大的元素移动到右端
}
L.data[low] = pivot;
return low;
}
//快速排序
void QuickSort(SeqList &L,int low,int high){
if(low<high){
//Partition就是划分操作,将表划分为满足上述条件的两个子表
int pivotpos = Partition(L,low,high); //划分
QuickSort(L,low,pivotpos-1); //依次对两个子表进行递归排序
QuickSort(L,pivotpos+1,high);
}
}
//输出顺序表
void printTable(SeqList L){
int i;
for(i = 0;i<L.length;i++){
printf("%d\t",L.data[i]);
}
printf("\n");
}
int main(){
SeqList L; //创建表
createTable(L);
printf("排序前的列表为:\n");
printTable(L); //打印表
QuickSort(L,0,4); //快速排序算法
printf("排序后的列表为:\n");
printTable(L); //打印排序后的
return 0;
}