今天学习了快速排序分享自己的心得。
快排就我个人理解就是递归+分治的原则。
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);
}
}