隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          快速排序(quicksort)算法實現

              快速排序(quicksort)是分治法的典型例子,它的主要思想是將一個待排序的數組以數組的某一個元素X為軸,使這個軸的左側元素都比X大,而右側元 素都比X小(從大到小排序)。然后以這個X在變換后數組的位置i分為左右兩個子數組,再分別進行快速排序,直到子數組中只有一個元素為止。

          快速排序算法如下
          void quicksort(int A[], int p, int r)
          {
              
          int i;
              
          if(p < r)
              {
                  i 
          = partition(A, p, r);
                  quicksort(A, 
          0, i - 1);
                  quicksort(A, i 
          + 1, r);
              }   
          }

              其中partition函數將得到X所在的位置i(在這里總以數組的最后一個元素為軸)。
          int partition(int A[], int p, int r)
          {
              
          int i = p - 1, j;
              
          for(j = p; j < r; j++)
              {
                  
          if(A[j] >= A[r])
                  {
                      i
          ++;
                      swap(
          &A[i], &A[j]);
                  }
              }
              swap(
          &A[i + 1], &A[r]);
              
          return i + 1;
          }

              由于總是選擇數組的最后一個元素做為軸,因此可能出現X的左邊為n - 1或接近n - 1個元素,而右邊沒有元素,或元素很少的情況,即X最大或比較大。這樣使quicksort將出現最壞的情況,也就是時間復雜度為O(n^2)。因此partition可以采用隨機方式得到軸X的位置i。 這樣它的平均情況是非常好的(時間復雜度為O(nlogn)),也就是說,最壞情況很難出現。
          int new_random(int min, int max)
          {
              
          return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
          }

          int randomize_partition(int A[], int p, int r)
          {
              
          int i = new_random(p, r);
              swap(
          &A[i], &A[r]);
              
          return partition(A, p, r);
          }

          完整的代碼如下
          #include <stdio.h>
          #include 
          <stdlib.h>

          void out_int_array(int data[], int n)
          {
              
          int i;
              
          for(i = 0; i < n; i++)
              {
                  printf(
          "%d ", data[i]);
              }
              printf(
          "\n");
          }
          void swap(int *a, int *b)
          {
              
          int x;
              x 
          = *a;
              
          *= *b;
              
          *= x;
          }

          int new_random(int min, int max)
          {
              
          return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
          }
          int partition(int A[], int p, int r)
          {
              
          int i = p - 1, j;
              
          for(j = p; j < r; j++)
              {
                  
          if(A[j] >= A[r])
                  {
                      i
          ++;
                      swap(
          &A[i], &A[j]);
                  }
              }
              swap(
          &A[i + 1], &A[r]);
              
          return i + 1;
          }

          void quicksort(int A[], int p, int r)
          {
              
          int i;
              
          if(p < r)
              {
                  i 
          = partition(A, p, r);
                  quicksort(A, 
          0, i - 1);
                  quicksort(A, i 
          + 1, r);
              }   
          }

          int randomize_partition(int A[], int p, int r)
          {
              
          int i = new_random(p, r);
              swap(
          &A[i], &A[r]);
              
          return partition(A, p, r);
          }

          void randomize_quicksort(int A[], int p, int r)
          {
              
          int i;
              
          if(p < r)
              {
                  i 
          = randomize_partition(A, p, r);
                  quicksort(A, 
          0, i - 1);
                  quicksort(A, i 
          + 1, r);
              }   
          }

          int main()
          {
              
          int A[] = {4144-12512530};
              
          int B[] = {4144-12512530};
              out_int_array(A, 
          7);
              quicksort(A, 
          06);
              out_int_array(A, 
          7);
              printf(
          "--------------------------randomize-----------------------------\n");   
              srand((unsigned)time( NULL ));
              randomize_quicksort(B, 
          06);
              out_int_array(B, 
          7);
              
          return 0;
          }




          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-05-14 20:14 銀河使者 閱讀(6586) 評論(1)  編輯  收藏 所屬分類: algorithmC/C++

          評論

          # re: 快速排序(quicksort)算法實現  回復  更多評論   

          主函數里用了time()函數,要加個頭文件吧,include<time.h>。小問題,謝謝共享
          2014-10-09 23:12 | 志在四方
          主站蜘蛛池模板: 抚松县| 色达县| 济源市| 瓮安县| 南涧| 长春市| 苏尼特右旗| 黎平县| 尼勒克县| 屯门区| 重庆市| 武义县| 环江| 搜索| 诏安县| 静安区| 宝清县| 辰溪县| 宝应县| 宜阳县| 辽宁省| 新沂市| 临潭县| 内江市| 宁波市| 榆林市| 竹山县| 原平市| 花莲县| 信宜市| 读书| 曲阜市| 大厂| 吉林市| 兴宁市| 凤庆县| 丹凤县| 微博| 太仆寺旗| 鄂州市| 莱州市|