快速排序算法

来源:互联网 发布:java license 编辑:程序博客网 时间:2024/06/10 09:08
快速排序是一种比较快的排序,也是一种很经典的排序,诞生于1962年
它的采用分治法,分治法基本思想是将原问题分解为比原问题更小但是跟原问题结构相似的子问题,递归的解决这些子问题,则原问题就迎刃而解
快速排序的思想是
1. 分解
    在数组中选择一个作为基准(pivot),并以此基准划分当前数组,使大于此基准的元素全部位于基准的右边,小于此基准的元素全部位于基准的左边
    
2.求解
    分别将位于基准左边和右边的元素作为要排序的数组,递归调用进行快速排序
    
3.组合
    当上述数组已排序完毕时,将左边数组 + 基准 + 右边数组 组合在一起,完成整个排序

C语言描述
//将数组与数组元素的个数作为形参
void my_quicksort(int a[],int n) {
    void my_qsort(int a[], int low, int high);
    my_qsort(a, 0, n-1);
}
//将数组与数组的最左边及最右边元素作为形参
void my_qsort(int a[], int low, int high) {
    int pivottag;//基准元素在数组中的位置
    //递归调用快速排序,直到待排序的数组剩下一个元素
    if(low < high) {
        pivottag = my_partitions(a, low, high);
        my_qsort(a,low,pivottag - 1);//基准左边的元素排序
        my_qsort(a,pivottag +1, high);//基准右边的元素排序
    }
}
//一次快速排序
int my_partitions(int a[], int low, int high) {
    int pivotkey;//基准
    pivotkey = a[low];
    //整个数组还未遍历完毕
    while(low < high) {
        while(pivotkey <= a[high]  && low < high) {
            --high;
        }
         //若基准右边的数组元素小于基准,则将此元素转移到基准左边
        a[low] = a[high];
        while(pivotkey >= a[low] && low < high) {
            ++low;
        }
        //若基准左边的数组元素大于基准,则将此元素转移到基准右边
        a[high] = a[low];
    }
    //将基准转移到相应位置
    a[low] = pivotkey;
    //返回基准所在数组中的位置
    return low;
}