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

    一、快速排序的原理

    使用分治算法进行快速排序,以最后一个元素为标识,然后从头开始遍历,把比这个标识小的元素全部放在左边,把比这个标识大的元素全部放在右边,最后就用这个标识将数组分成了两个部分,然后再分别对标识的前后部分的数组继续进行排序,如此下去就能得到排好序的数组。

    二、快速排序的伪代码实现

     1 QUICKSORT(A, p, r)  
     2  if p < r  
     3     then q ← PARTITION(A, p, r)  
     4          QUICKSORT(A, p, q - 1)  
     5          QUICKSORT(A, q + 1, r)  
     6 PARTITION(A, p, r)  
     7   x ← A[r]  
     8   i ← p - 1  
     9   for j ← p to r - 1  
    10        do if A[j] ≤ x  
    11              then i ← i + 1  
    12              exchange A[i] ←→ A[j]  
    13   exchange A[i + 1] ←→ A[r]  
    14   return i + 1  

    三、快速排序的Java代码实现

     1 import java.util.Comparator;
     2 
     3 
     4 public class QuickSort {
     5     
     6     public static <T> void quickSort(T[] t, int p, int r, Comparator<? super T> c){
     7         if(p < r-1){
     8             int q = partition(t, p, r, c);
     9             quickSort(t, p, q, c);
    10             quickSort(t, q+1, r, c);
    11             
    12         }
    13     }
    14     public static <T> int partition(T[] t, int p, int r, Comparator<? super T> c){
    15         T x = t[r-1];
    16         int i = p-1;
    17         for(int j = p; j < r-1; j ++){
    18             if(c.compare(t[j], x) < 0){
    19                 i = i + 1;
    20                 T temp = t[i];
    21                 t[i] = t[j];
    22                 t[j] = temp;
    23             }
    24         }
    25         T temp = t[i+1];
    26         t[i+1] = t[r-1];
    27         t[r-1] = temp;
    28         return i + 1;        
    29     }
    30     
    31     public static <T> void quickSort(T[] t, Comparator<? super T> c){
    32         quickSort(t, 0, t.length, c);
    33     }
    34     
    35     public static void main(String[] args){
    36         //在这里进行代码测试
    37         Integer[] ints = new Integer[]{2, 0, 5, 23, 1, 4, 8, 56, 19};
    38         quickSort(ints, new Comparator<Integer>(){
    39             public int compare(Integer o1, Integer o2){
    40                 return o1-o2;
    41             }
    42         }); 
    43         
    44         for(int i = 0; i < ints.length; i ++){
    45             System.out.print(ints[i] + " ");
    46         }
    47     }
    48 }

    运行结果:

    0 1 2 4 5 8 19 23 56 
  • 相关阅读:
    Android 源码阅读之MMS细读TransactionService.java
    [Java2 入门经典]第16章 线程
    Android 源码阅读之建立3G网络流程
    从架构上看Android多媒体播放器
    Android 开发日志之仿三星Launcher
    非常适合OA系统的菜单
    模拟动网当前位置下拉菜单
    模拟windows菜单选项卡效果
    TreeView的各种操作
    ASCII表
  • 原文地址:https://www.cnblogs.com/keke-xiaoxiami/p/4333297.html
Copyright © 2011-2022 走看看