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

     快速排序:

    1. 样例求解:5 7 10 6 9 4 3 8

     

    2. i要从基数开始,因为如果对于要排序的一个区间,基数恰好就是最小的那个数,那么它对于后面的排序无影响,整个过程不需要交换,当时由代码的思想需要将基数调到小于它的数的右边,如果从基数后面的数开始遍历,那么当基数为最小值时,也会出现基数后面的数和基数交换的情况,所以要从基数开始。

    3. 不能先从i开始遍历,因为如果从i开始遍历由下标i累加的条件,i至少会先累加一,但是如果基数也就是最开始下标i所对应的数恰好是区间最小值,i实际上不需要变话,如果从j开始,在这种情况下,j会递减到i为止,循环将会停止,返回基数的下标。

    #include<stdio.h>
    #define maxn 2000
    #pragma warning(disable:4996)
    using namespace std;
    int f[maxn];
    int n;
    void swap(int a[], int x, int y)
    {
        int t = a[x];
        a[x] = a[y];
        a[y] = t;
    }
    int  part(int a[],int l,int r)
    {
        int i = l, j = r-1;
        int x = a[l];
        while (i != j)
        {        
            while (a[j] > x && i < j)j--;
            while (a[i] <= x && i < j) i++;    
            if (i < j)
            {
                swap(a, i, j);
            }
        }
        a[l] = a[j];
        a[j] = x;
        return j;
    }
    void q_sort(int a[], int l, int r)
    {
        if (r - l <= 1) return;
        int x = part(a, l, r);
        q_sort(a, l, x);
        q_sort(a, x + 1, r);
        return;
    }
    int main()
    {
        scanf("%d",&n);
        for (int i = 0; i < n; i++)
        scanf("%d",f+i);
        q_sort(f, 0, n);
        for (int i = 0; i < n; i++)
            printf("%d ",f[i]);
    
        getchar();
        getchar();
        return 0;
    }
  • 相关阅读:
    女子腰背疼痛案
    老人心悸心膝部无力屈伸不利案
    经方生姜泻心汤临床应用发挥
    电话求诊易误治
    女子乳房结块案
    小儿手足口案
    门纯德老先生经验
    男子肋部掣痛案
    加味潜降汤治疗阴虚阳亢之眩晕(来自网络)
    三叉神经痛与芎胡六虫汤
  • 原文地址:https://www.cnblogs.com/zxzmnh/p/11573787.html
Copyright © 2011-2022 走看看