• 快速排序


    参考资料:

    代码:

    QuickSort.java

     1 package algorithms;
     2 
     3 import java.util.Arrays;
     4 import java.util.Random;
     5 
     6 import sorts.InsertionSort;
     7 
     8 public class QuickSort {
     9     
    10     private static final int SMALL_ARRAY_SIZE = 5;
    11     
    12     /**
    13      * sort the array
    14      * @param array the array to be sorted
    15      * @param low the lower bound (inclusive)
    16      * @param high the upper bound (exclusive)
    17      * */
    18     public static <T extends Comparable<T>>
    19     void sort(T[] array, int low, int high) {
    20         --high; // right the upper bound (exclusive)
    21         _sort(array, low, high);
    22     }
    23     private static <T extends Comparable<T>> void 
    24     _sort(T[] array, int low, int high) {
    25         if (high - low + 1 <= SMALL_ARRAY_SIZE) {
    26             InsertionSort.sort(array, low, high+1); 
    27         } else {
    28             int pivotIndex = medianOf3(array, low, high);
    29             int partition = Partition.doPartition(array, low, high+1, pivotIndex);
    30             _sort(array, low, partition-1);
    31             _sort(array, partition+1, high);
    32         }
    33     }
    34     // medianOf3() requires the array's length to be at least 4
    35     private static <T extends Comparable<T>> int medianOf3(T[] array, int low, int high) {
    36         int middle = (low + high) / 2;
    37         if (array[low].compareTo(array[middle]) > 0) {
    38             swap(array, low, middle);
    39         }
    40         if (array[low].compareTo(array[high]) > 0) {
    41             swap(array, low, high);
    42         }
    43         if (array[middle].compareTo(array[high]) > 0) {
    44             swap(array, middle, high);
    45         }
    46         swap(array, middle, high-1);
    47         return high-1;
    48     }
    49     
    50     private static <T> void swap(T[] array, int index1, int index2) {
    51         T temp = array[index1];
    52         array[index1] = array[index2];
    53         array[index2] = temp;
    54     }
    55     
    56     // test
    57     public static void main(String[] args) {
    58         Random random = new Random();
    59         int num = 10;
    60         Integer[] a = new Integer[num];
    61         for (int i = 0; i < num; i++) {
    62             a[i] = random.nextInt(100);
    63         }
    64         System.out.println(Arrays.toString(a));
    65         QuickSort.sort(a, 0, a.length);
    66         System.out.println(Arrays.toString(a));
    67     }
    68     
    69 }

    Partition.java

     1 package algorithms;
     2 
     3 public class Partition {
     4     
     5     /**
     6      * 
     7      * Partition the array into 2 parts, the index range of the left part is [left, i-1], the index range of
     8      * the right part is [i, right], such that all elements smaller 
     9      * than the pivot are in the left part and all elements no smaller than the pivot
    10      * are in the right part.
    11      * @param left left bound (inclusive)
    12      * @param right right bound (exclusive)
    13      * @return the index of the left-most element in the right part, that is, i.
    14      * */
    15     public static <T extends Comparable<T>> int doPartition(T[] a, int left, int right, int pivotIndex) {
    16         --right;
    17         T pivot = a[pivotIndex];
    18         swap(a, right, pivotIndex); // set the pivot to the rightmost position
    19         int i = left - 1;
    20         for (int j = left; j <= right - 1; ++j) {
    21             if (a[j].compareTo(pivot)<=0) {
    22                 ++i;
    23                 swap(a, i, j);
    24             }
    25         }
    26         swap(a, i+1, right);
    27         return i+1;
    28     }
    29     
    30     private static <T> void swap(T[] array, int index1, int index2) {
    31         T temp = array[index1];
    32         array[index1] = array[index2];
    33         array[index2] = temp;
    34     }
    35 
    36 }
  • 相关阅读:
    iOS 索引列 使用详解
    iOS 搜索条使用详解
    iOS 百度地图使用详解
    在iOS中使用ZBar扫描二维码和条形码
    自学html-five(锚点、伪类、字符实体)
    自学html-four(css初始化及html语义标签 -> h标签 p标签 img标签 有序列表 无序列表 表格 超链接)
    自学html--htree(CSS)
    自学html--two(盒模型)
    自学html--one(div布局)
    常用控件补充(UIDatePicker、UIWebView)
  • 原文地址:https://www.cnblogs.com/qrlozte/p/3960392.html
Copyright © 2020-2023  润新知