最近温习算法,花点时间写了点代码验证下,在这里做个存档。
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 }