隨筆 - 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 | 志在四方
          主站蜘蛛池模板: 大兴区| 乌海市| 海城市| 隆回县| 松滋市| 盐亭县| 乌海市| 尼勒克县| 文山县| 赣榆县| 石城县| 惠州市| 从化市| 荔波县| 龙胜| 保德县| 邢台县| 海兴县| 博野县| 阳曲县| 宕昌县| 天柱县| 金门县| 永修县| 正镶白旗| 桂平市| 松原市| 云南省| 庄河市| 疏附县| 开封市| 墨玉县| 剑河县| 灌南县| 夏津县| 彰化市| 大城县| 齐齐哈尔市| 雷州市| 长垣县| 吉安市|