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

    算法描述   分而治之

    过程1:以65为主元,将小于65的为一组放在65左边。大于65的为一组放在65右边。  排序后: {左边}  主元(65) {右边}

    递归的进行。在左边这一组选一个主元,重复上过程1。右边这一组选一个主,重复过程1。

    直到左边右边都只有一个元素。

    对于小规模数据,用递归并不划算,小规模数据我们用简单排序。

    设定阈值,当数据规模小于阈值时,简单排序。大于阈值,分而治之。

     1 int Median3(ElementType A[],int Left,int Right)// 选主元。
     2 { 
     3     int center;
     4     center=(Left+Right)/2;
     5     if(A[Left]>A[center])
     6         Swap(A+Left,A+center);
     7     if(A[Left]>A[Right])
     8         Swap(A+Left,A+Right);
     9     if(A[center]>A[Right])
    10         Swap(A+center,A+Right);
    11     Swap(A+center,A+Right-1);
    12     return A[Right-1];//把主y元放在r-1的位置,这样left,r-1,right都是有序的,排序的时候只需从l+1,到r-2。
    13 
    14 }
    15 void Quicksort(ElementType A[] ,int Left,int Right)
    16 {
    17     int pivot,k,i,j,cutoff;
    18     cutoff=50;
    19     
    20     if(Right-Left>cutoff)    //小于阈值,快速排序,小规模排序,递归
    21     {
    22         pivot=Median3(A,Left,Right);
    23         i=Left;   //排序的时候只需从l+1,到r-2。
    24         j=Right-1;
    25         while(1)
    26         {
    27             while(A[++i]<pivot);
    28             while(A[--j]>pivot);  //超级错误
    29             if (i<j)
    30                 Swap(A+j,A+i);
    31             else break;
    32          
    33         }
    34         Swap(A+i,A+Right-1);
    35         Quicksort(A,Left,i-1);
    36         Quicksort(A,i+1,Right);
    37     
    38     }
    39     else
    40     {
    41         //简单排序
    42         Insertion_sort( A,  Right-Left);
    43     }
    44 }
    45 void Quick_Sort(ElementType A[],int N)
    46 {
    47     Quicksort(A,0,N-1);
    48 }

    错误分析:

    1. 28行   --j不要写成++j,j是高位,从右往左移动

    2. 22行     pivot  不要写在if的外面,只有快速排序的时候才会用pivot

  • 相关阅读:
    爬虫示例
    S20_DAY23--课堂笔记
    python--常用模块之正则
    S20_DAY22--课堂笔记
    win10系统重装
    CCF 命令行选项
    CCF 任务调度
    CCF 出现次数最多的数
    CCF ISBN
    CCF 最大的矩形
  • 原文地址:https://www.cnblogs.com/zle1992/p/5861305.html
Copyright © 2011-2022 走看看