快速排序

今天学习了快速排序大笑分享自己的心得。

快排就我个人理解就是递归+分治的原则。

1.找一个基准值,通常以第一个数值为基准值;

2.左右两端设置哨兵left,right,用于与基准值比较

3.递归上述的方法

总的来说快速排序简单的说就是选择一个基准,将比基准值大的数放在一边,小的数放到另一边。对这个数的两边再递归上述方法。

找了个图,方便理解:


时间复杂度分析:

快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。

最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。时间复杂度为O(n*n)

在最好情况下,每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)

尽管快速排序的最坏时间为O(n2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。

话不多说,奉上代码,如有错误请多指教!

//
//  main.c
//  myprojectc
//
//  Created by josephvitt on 2017/6/28.
//  Copyright © 2017年 josephvitt. All rights reserved.
//

#include <stdio.h>
//函数声明
void quicksort(int arr[],int head,int tail);
int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    int array[] = {10,5,3,1,7,2,8,9};
    int i;
    for (i=0; i<8; i++) {
        printf("%d ",array[i]);
    }
    printf("\n*****quick sort******\n");
    quicksort(array,0,7);
    for (i=0; i<8; i++) {
        printf("%d ",array[i]);
    }
    printf("\n");
    return 0;
}
//快速排序
void quicksort(int arr[],int left,int right){
    if(left<right){
        int i,j,temp;
        i=left;
        j=right;
        temp = arr[left];
        while (i<j) {
            while (i<j && arr[j]>temp) {
                j--;
            }
            if (i<j) {
                arr[i++] = arr[j];
            }
            while (i<j && arr[i]<temp) {
                i++;
            }
            if (i<j) {
                arr[j--] = arr[i];
            }
        }
        arr[i] = temp;
        quicksort(arr,left,i-1);
        quicksort(arr,i+1,right);
    }
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值