数据结构之快速排序

数据结构之快速排序:
算法思想:
在待排序表中选择一个元素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 20

typedef 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);               //递归对右边的子表排序
    }
}  //QuickSort

int 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);
}

运行结果:

这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值