数据结构篇:快排的C语言实现与个人解析
快排是很经典的算法,时间复杂度为O(n*log2n),空间复杂度最好O(log2n),最坏O(n),快排是一种不稳定排序。
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 7
typedef struct {
int r[Maxsize];
int length;
}SqList;
int partition(SqList &l,int low,int high){ //进行一趟排序算法,返回枢纽位置 ;自己写的时候可以理解用一个尺子(枢纽),将序列分成两组
int keep=l.r[low]; //保存下枢纽的值,这一步要小心,否则可能丢掉枢纽的值
int pivotkey=l.r[low]; //子表第一个记录作为枢纽
while(low<high){
while(low<high&&l.r[high]>=pivotkey) high--;
l.r[low]=l.r[high];
while(low<high&&l.r[low]<=pivotkey) low++;
l.r[high]=l.r[low];
}
l.r[low]=keep;
return low; //返回枢纽位置
}
void QSort(SqList &l,int low,int high){
if(low<high){
int pivot=partition(l,low,high);
QSort(l,low,pivot-1); //对枢纽左边的表进行递归
QSort(l,pivot+1,high); //对枢纽右边的表进行递归
}
}
int main(){
SqList l;
l.length=6;
int i;
l.r[0]=15;l.r[1]=8;l.r[2]=16; //一组测试用例
l.r[3]=86;l.r[4]=66;l.r[5]=20;
printf("........快排前......\n");
for (i=0;i<6; i++){
printf("%d ",l.r[i]);
}
printf("\n........快排后....。.\n");
QSort(l,0,5);
for (i=0; i<6;i++){
printf("%d ",l.r[i]);
}
return 0;
}
个人解析
快排还是基于的分治思想,当问题规模比较复杂时,但能将问题分解成相同情况的子问题并不断分下去就可以用分治的思想。递归可以很好实现,在逻辑上比较清晰简单。
今天听《一生所爱》听的不想敲了,咕咕咕,明天继续。