快排、冒泡、选择
1 /** 2 * This file created at 2015年8月2日. 3 * 4 * Copyright (c) 2002-2015 Bingosoft, Inc. All rights reserved. 5 */ 6 package SortExample; 7 8 /** 9 * <code>{@link Sort}</code> 10 * 11 * TODO : document me 12 * 13 * @author yabushan 14 */ 15 16 public class Sort { 17 18 /** 19 * 冒泡排序 20 * 21 * @param data 22 * 目标数组 23 */ 24 public static void bubbleSort(int[] data) { 25 26 for (int i = 0; i < data.length - 1; i++) {// 控制趟数 27 for (int j = 0; j < data.length - i - 1; j++) { 28 29 if (data[j] > data[j + 1]) { 30 int tmp = data[j]; 31 data[j] = data[j + 1]; 32 data[j + 1] = tmp; 33 } 34 } 35 } 36 37 } 38 39 /** 40 * 选择排序 41 * 42 * @param data 43 * 目标数组 44 */ 45 public static void selectSort(int[] data) { 46 if (data == null || data.length == 0) { 47 return; 48 } 49 50 for (int i = 0; i < data.length - 1; i++) { 51 int min = i;// 将当前下标定为最小值下标 52 for (int j = i + 1; j < data.length; j++) { 53 if (data[j] < data[min]) { 54 min = j; 55 } 56 } 57 58 if (i != min) { 59 int tmp = data[i]; 60 data[i] = data[min]; 61 data[min] = tmp; 62 } 63 } 64 } 65 66 /** 67 * 选择排序 此算法效率不如上面的高 68 * 69 * @param sort 70 */ 71 public static void selectSort2(int[] data) { 72 73 for (int i = 0; i < data.length - 1; i++) { 74 for (int j = i + 1; j < data.length; j++) { 75 if (data[j] < data[i]) { 76 int temp = data[j]; 77 data[j] = data[i]; 78 data[i] = temp; 79 } 80 } 81 } 82 } 83 84 /** 85 * 快速排序算法 86 * 87 * @param data 88 * 目标数组 89 * @param start 90 * 起始位 91 * @param end 92 * 结束位 93 */ 94 public static void quickSort(int[] data, int start, int end) { 95 // 设置关键数据key为要排序数组的第一个元素, 96 // 即第一趟排序后,key右边的数全部比key大,key左边的数全部比key小 97 int key = data[start]; 98 // 设置数组左边的索引,往右移动比key大的数 99 int i = start; 100 // 设置数组右边的索引,往左移动比key小的数 101 int j = end; 102 // 如果左边索引比右边索引小,则还有数据没有排序 103 while (i < j) { 104 while (data[j] > key && j > i) { 105 j--; 106 } 107 data[i] = data[j]; 108 109 while (data[i] < key && i < j) { 110 i++; 111 } 112 data[j] = data[i]; 113 } 114 // 此时 i==j 115 data[i] = key; 116 117 // 递归调用 118 if (i - 1 > start) { 119 // 递归调用,把key前面的完成排序 120 quickSort(data, start, i - 1); 121 } 122 if (i + 1 < end) { 123 // 递归调用,把key后面的完成排序 124 quickSort(data, i + 1, end); 125 } 126 } 127 128 /** 129 * @param args 130 */ 131 public static void main(String[] args) { 132 int[] p = { 34, 21, 54, 18, 23, 76, 38, 98, 45, 33, 27, 51, 11, 20, 79, 133 30, 89, 41 }; 134 135 long start = System.currentTimeMillis(); 136 137 // Sort.bubbleSort(p);// 冒泡排序 138 // Sort.selectSort(p);// 选择排序 139 // Sort.selectSort2(p);// 选择排序2 140 Sort.quickSort(p, 0, p.length - 1);// 快速排序 141 142 System.out.println("所用时间:" + (System.currentTimeMillis() - start)); 143 for (int i = 0; i < p.length; i++) { 144 System.out.print(p[i] + " "); 145 } 146 } 147 148 }