主要排序算法的Java实现

最近温习算法,花点时间写了点代码验证下,在这里做个存档。

  1 package com.chrischeng.hacker;
  2 
  3 import java.util.*;
  4 
  5 /**
  6  * Created by Yexin on 2016/11/4.
  7  */
  8 
  9 //Complete the code
 10 public class Solution
 11 {
 12     private final static int ARRAYSIZE = 50;
 13     private final static int ARRAYRANGE = ARRAYSIZE * 2;
 14 
 15     // 通过随机数发生器生成一个指定大小的随机数组
 16     public static int[] createArray(int size){
 17         int []retArray = new int [size];
 18         Random random = new Random();
 19         for(int i = 0;i < size;i++)
 20             retArray[i] = random.nextInt(ARRAYRANGE);
 21         return retArray;
 22     }
 23 
 24     // 打印指定数组
 25     public static void printArray(int []arr){
 26         for(int a : arr)
 27             System.out.print(a + " ");
 28         System.out.println();
 29     }
 30 
 31     // 交换数组中指定序号的元素值
 32     public static void swap(int[] arr, int i, int j ){
 33         if(i >= arr.length || j >= arr.length)
 34             return;
 35         else{
 36             int temp = arr[i];
 37             arr[i] = arr[j];
 38             arr[j] = temp;
 39         }
 40     }
 41 
 42     // 使用带有标志位的冒泡排序
 43     public static void bubbleSort(int []arr){
 44         int len = arr.length;
 45         boolean flag = false;
 46         for(int i = 0; i < len - 1; i++){
 47             for(int j = i + 1; j < len;j++){
 48                 if(arr[i] > arr[j]) {
 49                     swap(arr, i, j);
 50                     flag = true;
 51                 }
 52             }
 53             if(flag == false)
 54                 break;
 55         }
 56     }
 57 
 58     // 直接插入排序
 59     public static void insertionSort(int []arr){
 60         int len = arr.length, i = 1, j;
 61         for(; i < len; i++){
 62             int temp = arr[i];
 63             if(arr[i - 1] > arr[i]){
 64                 j = i - 1;
 65                 while(j >= 0 && arr[j] > temp) {
 66                     arr[j+1] = arr[j];
 67                     j--;
 68                 }
 69                 arr[j+1] = temp;
 70             }
 71         }
 72     }
 73 
 74     // Shell排序(本质上就是分治法的直接插入排序)
 75     public static void shellSort(int []arr){
 76         int len = arr.length, gap, i, j;
 77         for(gap = len/2; gap > 0; gap /= 2){
 78             for(i = gap;i < len; i++){
 79                 if(arr[i] < arr[i -gap]){
 80                     int temp = arr[i];
 81                     j = i - gap;
 82                     while(j >= 0 && arr[j] > temp){
 83                         arr[j+gap] = arr[j];
 84                         j -= gap;
 85                     }
 86                     arr[j+gap] = temp;
 87                 }
 88             }
 89         }
 90     }
 91 
 92     // 快速排序
 93     public static void quickSort(int []arr, int l, int r){
 94         if(l < r) {
 95             int i = l, j = r, base = arr[r];
 96             while (i < j) {
 97                 // 由左至右遍历,找到第一个大于中轴的元素
 98                 while (i < j && arr[i] < base)
 99                     i++;
100                 // 如果i和j没有交叉且找到了第一个大于中轴的元素(index为i),则将它的值存放在j的位置,而j位置的值存放在base中
101                 if (i < j)
102                     arr[j--] = arr[i];
103                 // 从右到左遍历,找到第一个小于中轴的元素
104                 while (i < j && arr[j] > base)
105                     j--;
106                 // 如果i和j没有交叉且找到了第一个小于中轴的元素,则将他的值存放在上一步中index-i的位置上
107                 if (i < j)
108                     arr[i++] = arr[j];
109             }
110             // 上面的遍历完成后,i左侧都是小于base的元素,右侧都是大于base的元素,base作为中值存放在index=i的位置上,并不参与下次排序
111             arr[i] = base;
112             // 分别对数组左右侧进行递归排序
113             quickSort(arr,l,i-1);
114             quickSort(arr,i+1,r);
115         }
116     }
117 
118     // 桶排序
119     // 本质上其实就是彻底的牺牲空间换取时间的做法
120     // 适用于数字范围在一定区间内的随机数组
121     public static void bucketSort(int arr[]){
122         // 此处之所以使用对象数组,是因为实际情况中存在多个同值元素存在的可能性
123         ArrayList<Integer> buckets[] = new ArrayList[ARRAYRANGE + 1];
124         for(int i : arr) {
125             if (buckets[i] == null)
126                 buckets[i] = new ArrayList<Integer>();
127             buckets[i].add(new Integer(i));
128         }
129         int index = 0;
130         for(ArrayList<Integer> al : buckets){
131             if(null != al && al.size() > 0){
132                 for(Integer i : al)
133                     arr[index++] = i;
134             }
135         }
136     }
137 
138     // 基数排序
139     // 本质上就是按照从低位到高位的桶排序,所以无论随机数组的长度为多大,永远只需要十个桶
140     public static void radixSort(int arr[]){
141     }
142 
143     public static void main(String[] args){
144         int [] arr = createArray(ARRAYSIZE);
145         printArray(arr);
146         bucketSort(arr);
147         printArray(arr);
148     }
149 }

 

posted @ 2017-02-27 00:40  Berne  阅读(167)  评论(0编辑  收藏  举报