zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序核心思想:从数列中取出一个数作为基准数。将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

    再进行递归,最后只有三个数,即基准数左右都只剩下一个数。

    通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    步骤总结:

    1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。

    2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。

    3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。

    4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

    /*
     * Quick.c
     *
     *  Created on: 2017年4月18日
     *      Author: zzd
     */
    
    #include<stdio.h>
    #include<stdlib.h>
    void Quick(int a[],int l,int n)
    {
        if(l<n)
        {
            int i=l,j=n,x=a[l];
            while(i<j)
            {
                while(i<j&&a[j]>=x){j--;} //从右到左找第一个小于X的数
    
                if(i<j){a[i++]=a[j];}
    
                while(i<j&&a[i]<x){i++;}//从左到右找第一个大于X的数
    
                if(i<j){a[j--]=a[i];}
            }
            a[i]=x;
            Quick(a,l,i-1);
            Quick(a,i+1,n);
        }
    
    }
    int main()
    {
        int b[10]={1,546,8,3,26,45,789,125,645,22};
        Quick(b,0,9);
        for(int o=0;o<10;o++) printf("%d
    ",b[o]);
        return 0;
    }


    // 详细版
    int quickSortPartition(int array[], int low, int high) {
        
        int i = low, j = high;
        
        // 将第一个元素作为哨兵
        int sentry = array[i];
        
        while (i < j) {
            
            // 从右往左找第一个小于哨兵的元素
            while (i < j && array[j] >= sentry) {
                j--;
            }
            
            if (i < j) {
                array[i] = array[j];
                i++;
            }
            
            // 从左往右找第一个大于哨兵的元素
            while (i < j && array[i] <= sentry) {
                i++;
            }
            
            if(i < j) {
                array[j] = array[i];
                j--;
            }
        }
        
        // 把哨兵放在 i == j 处
        array[i] = sentry;
        
        // 返回哨兵的位置
        return i;
    }
    
    void quickSort(int array[], int low, int high) {
        if (low < high) {
            
            // 分界点
            int partition = quickSortPartition(array, low, high);
            // 递归实现
            quickSort(array, low, partition - 1);
            quickSort(array, partition + 1, high);
        }
    }
    // 简洁版
    void quickSort1(int array[], int low, int high) {
        
        int i, j, temp;
        i = low;
        j = high;
        temp = array[low];
        
        if (low > high) {
            return;
        }
        
        while (i != j) {
            
            // 从右往左找第一个小于哨兵的元素
            while (i < j && array[j] >= temp)
                j--;
            
            if (j > i)
                array[i++] = array[j];
            
            // 从左往右找第一个大于哨兵的元素
            while (i < j && array[i] <= temp)
                i++;
            
            if (j > i)
                array[j--] = array[i];
        }
        
        array[i] = temp;
        quickSort1(array, low, i - 1);
        quickSort1(array, i + 1, high);
    }

    参考:

    https://www.jianshu.com/p/a4c589136e2b

    https://blog.csdn.net/MoreWindows/article/details/6684558

    
    
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 黑色星期五
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    控件动态产生器(使用RegisterClasses提前进行注册)
    Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
    Log4delphi使用心得
  • 原文地址:https://www.cnblogs.com/zzdbullet/p/9949755.html
Copyright © 2011-2022 走看看