数据结构之快速排序

来源:互联网 发布:2017百度春运大数据 编辑:程序博客网 时间:2024/06/07 04:37

数据结构之快速排序:
算法思想:
在待排序表中选择一个元素pivot作为基准,通过一趟排序将待排序表划分为两个独立的两部分,L[0~k-1]和L[k+1~length],使得L[0~k-1]的元素均小于pivot,L[k+1~length]的元素均大于pivot。此时,pivot放在了排序的最终位置上,这是一趟快速排序。
在递归的对L[0~k-1]、L[k+1~length]进行排序,当每部分只有一个元素或空,为止。此时,每个元素都放在了最终的位置上。
代码:

#include<stdio.h>#define ElemType int#define maxsize 20typedef struct{    ElemType data[maxsize];    int length;}sqlist;int flag=0;         //用来计数,表示排序次数//------------------------打印顺序表的元素--------------------------------void printElem(sqlist* l){    int i=0;    for(i=0;i<l->length;i++)        printf("%d ",l->data[i]);    printf("\n");}//---------------------------划分函数-------------------------------------int Partition(sqlist* l,int low,int high){    ElemType pivot=l->data[low];    while(low<high)                         //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];         //将比枢轴值大的元素移动到右端    }//while    l->data[low]=pivot;             //将枢轴元素放到最终位置    printf("第%d次快速排序的结果为:\n",++flag);    printElem(l);    return low;                      //返回存放枢轴的最终位置}//---------------------------排序函数-------------------------------------void QuickSort(sqlist* l,int low,int high){    if(low<high)    {        int pivotpos=Partition(l,low,high);        QuickSort(l,low,pivotpos-1);                //递归对左边的子表排序        QuickSort(l,pivotpos+1,high);               //递归对右边的子表排序    }}  //QuickSortint main(){    sqlist ll;    ll.length=0;    int i=0;    for(i=0;i<maxsize;i++)    {        ll.data[i]=rand()%100;        ll.length++;    }    printf("未排序的顺序表\n");    printElem(&ll);    QuickSort(&ll,0,ll.length-1);}

运行结果:

这里写图片描述