posts - 4, comments - 5, trackbacks - 0, articles - 10

          java排序法

          Posted on 2005-12-05 20:24 勇敢的心 閱讀(608) 評論(0)  編輯  收藏 所屬分類: Java
          /*這個程序是我在一個帖子上看到的,覺得寫的十分的不錯,拿出來與大家共享下*/
          package com.cucu.test; 

          public class Sort { 

            public void swap(int a[], int i, int j) { 
              int tmp = a[i]; 
              a[i] = a[j]; 
              a[j] = tmp; 
            } 

            public int partition(int a[], int low, int high) { 
              int pivot, p_pos, i; 
              p_pos = low; 
              pivot = a[p_pos]; 
              for (i = low + 1; i <= high; i++) { 
                if (a[i] > pivot) { 
                  p_pos++; 
                  swap(a, p_pos, i); 
                } 
              } 
              swap(a, low, p_pos); 
              return p_pos; 
            } 

            public void quicksort(int a[], int low, int high) { 
              int pivot; 
              if (low < high) { 
                pivot = partition(a, low, high); 
                quicksort(a, low, pivot - 1); 
                quicksort(a, pivot + 1, high); 
              } 

            } 

            public static void main(String args[]) { 
              int vec[] = new int[] { 37, 47, 23, -5, 19, 56 }; 
              int temp; 
              //選擇排序法(Selection Sort) 
              long begin = System.currentTimeMillis(); 
              for (int k = 0; k < 1000000; k++) { 
                for (int i = 0; i < vec.length; i++) { 
                  for (int j = i; j < vec.length; j++) { 
                    if (vec[j] > vec[i]) { 
                      temp = vec[i]; 
                      vec[i] = vec[j]; 
                      vec[j] = temp; 
                    } 
                  } 

                } 
              } 
              long end = System.currentTimeMillis(); 
              System.out.println("選擇法用時為:" + (end - begin)); 
              //打印排序好的結果 
              for (int i = 0; i < vec.length; i++) { 
                System.out.println(vec[i]); 
              } 
              //  冒泡排序法(Bubble Sort) 
              begin = System.currentTimeMillis(); 
              for (int k = 0; k < 1000000; k++) { 
                for (int i = 0; i < vec.length; i++) { 
                  for (int j = i; j < vec.length - 1; j++) { 
                    if (vec[j + 1] > vec[j]) { 
                      temp = vec[j + 1]; 
                      vec[j + 1] = vec[j]; 
                      vec[j] = temp; 
                    } 
                  } 

                } 
              } 
              end = System.currentTimeMillis(); 
              System.out.println("冒泡法用時為:" + (end - begin)); 
              //打印排序好的結果 
              for (int i = 0; i < vec.length; i++) { 
                System.out.println(vec[i]); 
              } 

              //插入排序法(Insertion Sort) 
              begin = System.currentTimeMillis(); 
              for (int k = 0; k < 1000000; k++) { 
                for (int i = 1; i < vec.length; i++) { 
                  int j = i; 
                  while (vec[j - 1] < vec[i]) { 
                    vec[j] = vec[j - 1]; 
                    j--; 
                    if (j <= 0) { 
                      break; 
                    } 
                  } 
                  vec[j] = vec[i]; 
                } 
              } 
              end = System.currentTimeMillis(); 
              System.out.println("插入法用時為:" + (end - begin)); 
              //打印排序好的結果 
              for (int i = 0; i < vec.length; i++) { 
                System.out.println(vec[i]); 
              } 

              //快速排序法(Quick Sort) 

              Sort s = new Sort(); 
              begin = System.currentTimeMillis(); 
              for (int k = 0; k < 1000000; k++) { 
                s.quicksort(vec, 0, 5); 
              } 
              end = System.currentTimeMillis(); 
              System.out.println("快速法用時為:" + (end - begin)); 
              //打印排序好的結果 
              for (int i = 0; i < vec.length; i++) { 
                System.out.println(vec[i]); 
              } 
            } 



          ************************************************************************************

          1. package org.jr.util;

          2. /**
          3. * Copyright: Copyright (c) 2002-2004
          4. * Company: JavaResearch(http://www.javaresearch.org)
          5. * 最后更新日期:2003年3月4日
          6. * @author Cherami
          7. */

          8. import org.jr.*;

          9. /**
          10. * 排序工具類,提供常見的需要排序但是又沒有實現Comparable接口的類。
          11. * 此類也提供一些創建的排序算法的范例。
          12. * @since  0.5
          13. */

          14. public class CompareUtil {
          15.   /**
          16.    * 私有構造方法,防止類的實例化,因為工具類不需要實例化。
          17.    */
          18.   private CompareUtil() {
          19.   }

          20.   /**
          21.    * 比較兩個數字。
          22.    * 這個方法取Number的double值進行比較,因此只有在兩個數嚴格相等的情況下才返回0,
          23.    * 又可能因為Java中Double型和Float的精度不同而導致兩個相等的數不返回0。
          24.    * @param o1 第一個數字
          25.    * @param o2 第二個數字
          26.    * @return 第一個數字大于第二個返回1,等于返回0,否則返回-1
          27.    * @since  0.5
          28.    */
          29.   public static int compare(Number o1, Number o2) {
          30.     double n1 = o1.doubleValue();
          31.     double n2 = o2.doubleValue();
          32.     if (n1 < n2) {
          33.       return -1;
          34.     }
          35.     else if (n1 > n2) {
          36.       return 1;
          37.     }
          38.     else {
          39.       return 0;
          40.     }
          41.   }

          42.   /**
          43.    * 比較兩個布爾型值。
          44.    * 如果兩個的值不同,true被認為等于1,而false等于0。
          45.    * @param o1 第一個值
          46.    * @param o2 第二個值
          47.    * @return 第一個值大于第二個返回1,等于返回0,否則返回-1
          48.    * @since  0.5
          49.    */
          50.   public static int compare(Boolean o1, Boolean o2) {
          51.     boolean b1 = o1.booleanValue();
          52.     boolean b2 = o2.booleanValue();
          53.     if (b1 == b2) {
          54.       return 0;
          55.     }
          56.     else if (b1) {
          57.       return 1;
          58.     }
          59.     else {
          60.       return -1;
          61.     }
          62.   }

          63.   /**
          64.    * 冒泡排序法排序。
          65.    * @param objects 排序對象
          66.    * @param isAscent 排序順序
          67.    * @return 排序后應該有的索引數組
          68.    * @since  0.5
          69.    */
          70.   public static int[] n2sort(Comparable[] objects, boolean isAscent) {
          71.     int length = objects.length;
          72.     int[] indexes = ArrayUtil.getInitedIntArray(length);
          73.     for (int i = 0; i < length; i++) {
          74.       for (int j = i + 1; j < length; j++) {
          75.         if (isAscent == true) {
          76.           if (objects[indexes[i]].compareTo(objects[indexes[j]]) > 0) {
          77.             swap(indexes, i, j);
          78.           }
          79.         }
          80.         else {
          81.           if (objects[indexes[i]].compareTo(objects[indexes[j]]) < 0) {
          82.             swap(indexes, i, j);
          83.           }
          84.         }
          85.       }
          86.     }
          87.     return indexes;
          88.   }

          89.   /**
          90.    * 冒泡排序法排序。
          91.    * @param objects 排序對象
          92.    * @param key 排序關鍵字
          93.    * @param isAscent 排序順序
          94.    * @return 排序后應該有的索引數組
          95.    * @since  0.5
          96.    */
          97.   public static int[] n2sort(PropertyComparable[] objects, int key,
          98.                              boolean isAscent) {
          99.     int length = objects.length;
          100.     int[] indexes = ArrayUtil.getInitedIntArray(length);
          101.     for (int i = 0; i < length; i++) {
          102.       for (int j = i + 1; j < length; j++) {
          103.         if (isAscent == true) {
          104.           if (objects[indexes[i]].compareTo(objects[indexes[j]], key) > 0) {
          105.             swap(indexes, i, j);
          106.           }
          107.         }
          108.         else {
          109.           if (objects[indexes[i]].compareTo(objects[indexes[j]], key) < 0) {
          110.             swap(indexes, i, j);
          111.           }
          112.         }
          113.       }
          114.     }
          115.     return indexes;
          116.   }

          117.   /**
          118.    * 冒泡排序法排序。
          119.    * @param objects 排序對象
          120.    * @return 按照升序排序后應該有的索引數組
          121.    * @since  0.6
          122.    */
          123.   public static int[] n2sort(Comparable[] objects) {
          124.     return n2sort(objects,true);
          125.   }

          126.   /**
          127.    * 冒泡排序法排序。
          128.    * @param objects 排序對象
          129.    * @param key 排序關鍵字
          130.    * @return 按照升序排序后應該有的索引數組
          131.    * @since  0.6
          132.    */
          133.   public static int[] n2sort(PropertyComparable[] objects, int key) {
          134.     return n2sort(objects,key);
          135.   }

          136.   /**
          137.    * 插入排序法排序。
          138.    * @param objects 排序對象
          139.    * @return 按照升序排序后應該有的索引數組
          140.    * @since  0.6
          141.    */
          142.   public static int[] insertionSort(Comparable[] objects) {
          143.     int length = objects.length;
          144.     int[] indexes = ArrayUtil.getInitedIntArray(length);
          145.     for (int i = 1; i < length; i++) {
          146.         int j = i;
          147.         Comparable B = objects[indexes[i]];
          148.         while ((j > 0) && (objects[indexes[j-1]].compareTo(B) > 0)) {
          149.             indexes[j] = indexes[j-1];
          150.             j--;
          151.         }
          152.         indexes[j] = i;
          153.     }
          154.     return indexes;
          155.   }

          156.   /**
          157.    * 插入排序法排序。
          158.    * @param objects 排序對象
          159.    * @param key 排序關鍵字
          160.    * @return 按照升序排序后應該有的索引數組
          161.    * @since  0.6
          162.    */
          163.   public static int[] insertionSort(PropertyComparable[] objects, int key) {
          164.     int length = objects.length;
          165.     int[] indexes = ArrayUtil.getInitedIntArray(length);
          166.     for (int i = 1; i < length; i++) {
          167.         int j = i;
          168.         Comparable B = objects[indexes[i]];
          169.         while ((j > 0) && (objects[indexes[j-1]].compareTo(B,key) > 0)) {
          170.             indexes[j] = indexes[j-1];
          171.             j--;
          172.         }
          173.         indexes[j] = i;
          174.     }
          175.     return indexes;
          176.   }

          177.   /**
          178.    * 選擇排序法排序。
          179.    * @param objects 排序對象
          180.    * @return 按照升序排序后應該有的索引數組
          181.    * @since  0.6
          182.    */
          183.   public static int[] selectionSort(Comparable[] objects) {
          184.     int length = objects.length;
          185.     int[] indexes = ArrayUtil.getInitedIntArray(length);
          186.     for (int i = 0; i < length; i++) {
          187.         int min = i;
          188.         int j;
          189.         //在未排序列表里面查找最小元素
          190.         for (j = i + 1; j < length; j++) {
          191.             if (objects[indexes[j]].compareTo(objects[indexes[min]]) <0 ) {
          192.                 min = j;
          193.             }
          194.         }
          195.         //將最小的元素交換到未排序元素的最開始
          196.         swap(indexes,i,min);
          197.     }
          198.     return indexes;
          199.   }

          200.   /**
          201.    * 選擇排序法排序。
          202.    * @param objects 排序對象
          203.    * @param key 排序關鍵字
          204.    * @return 按照升序排序后應該有的索引數組
          205.    * @since  0.6
          206.    */
          207.   public static int[] selectionSort(PropertyComparable[] objects, int key) {
          208.     int length = objects.length;
          209.     int[] indexes = ArrayUtil.getInitedIntArray(length);
          210.     for (int i = 0; i < length; i++) {
          211.         int min = i;
          212.         int j;
          213.         //在未排序列表里面查找最小元素
          214.         for (j = i + 1; j < length; j++) {
          215.             if (objects[indexes[j]].compareTo(objects[indexes[min]],key) <0 ) {
          216.                 min = j;
          217.             }
          218.         }
          219.         //將最小的元素交換到未排序元素的最開始
          220.         swap(indexes,i,min);
          221.     }
          222.     return indexes;
          223.   }

          224.   /**
          225.    * 雙向冒泡排序法排序。
          226.    * @param objects 排序對象
          227.    * @return 按照升序排序后應該有的索引數組
          228.    * @since  0.6
          229.    */
          230.   public static int[] bidirectionalBubbleSort(Comparable[] objects) {
          231.     int length = objects.length;
          232.     int[] indexes = ArrayUtil.getInitedIntArray(length);
          233.     int j;
          234.     int limit = objects.length;
          235.     int start = -1;
          236.     while (start < limit) {
          237.         start++;
          238.         limit--;
          239.         for (j = start; j < limit; j++) {
          240.             if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
          241.               swap(indexes,j,j+1);
          242.             }
          243.         }
          244.         for (j = limit; --j >= start;) {
          245.           if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
          246.             swap(indexes,j,j+1);
          247.           }
          248.         }
          249.     }
          250.     return indexes;
          251.   }

          252.   /**
          253.    * 雙向冒泡排序法排序。
          254.    * @param objects 排序對象
          255.    * @param key 排序關鍵字
          256.    * @return 按照升序排序后應該有的索引數組
          257.    * @since  0.6
          258.    */
          259.   public static int[] bidirectionalBubbleSort(PropertyComparable[] objects, int key) {
          260.     int length = objects.length;
          261.     int[] indexes = ArrayUtil.getInitedIntArray(length);
          262.     int j;
          263.     int limit = objects.length;
          264.     int start = -1;
          265.     while (start < limit) {
          266.         start++;
          267.         limit--;
          268.         for (j = start; j < limit; j++) {
          269.             if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
          270.               swap(indexes,j,j+1);
          271.             }
          272.         }
          273.         for (j = limit; --j >= start;) {
          274.           if (objects[indexes[j]].compareTo(objects[indexes[j+1]],key) > 0) {
          275.             swap(indexes,j,j+1);
          276.           }
          277.         }
          278.     }
          279.     return indexes;
          280.   }

          281.   /**
          282.    * 交換兩個元素的值。
          283.    * @param indexes 原索引數組
          284.    * @param i 第一行
          285.    * @param j 第二行
          286.    */
          287.   private static void swap(int[] indexes, int i, int j) {
          288.     int tmp = indexes[i];
          289.     indexes[i] = indexes[j];
          290.     indexes[j] = tmp;
          291.   }

          292. }
          293. ------------------------------------------
          294. 冒泡排序:
          295. 1、比較相鄰的兩個元素,如果后面的比前面小,就對調二者。反復比較,到最后兩個元素。結果,最大值就跑到了最末位置。

          296. 2、反復第一步,直到所有較大值都跑到靠后的位置。

          297. ---------------------------------------------

          298. 選擇排序

          299. 1、一開始整個數列是未排列的

          300. 2、從未排列的數中,挑選出最小的數,和未排列的數中的第一個元素互調,并將該最小的數歸類到已排序的序列中;

          301. 3、重復第2步,直到所有的數都歸類到已排序數列中。

          302. ---------------------------------------------

          303. 插入排序法:

          304. 1、一開始只有第一個數在已排序數列中,其他的數歸類到未排序數列中;

          305. 2、將未排序的第一個數,插入到已排序數列中,使得插入后的已排序數列仍然維持由小到大的順序;

          306. 3、重復步驟2,直到所有的數都在已排序數列中。

          307. -----------------------------------------------

          主站蜘蛛池模板: 息烽县| 汉寿县| 平度市| 喀喇| 五华县| 万宁市| 灵台县| 朔州市| 繁峙县| 凤翔县| 九龙坡区| 汨罗市| 莱阳市| 葵青区| 湾仔区| 肥城市| 英吉沙县| 汨罗市| 达尔| 安陆市| 浮梁县| 景洪市| 卢龙县| 大方县| 高雄市| 泰顺县| 田东县| 晋宁县| 宜川县| 澎湖县| 合肥市| 泰顺县| 遂昌县| 平陆县| 二连浩特市| 安龙县| 兴宁市| 上杭县| 香港| 淳安县| 普兰店市|