package sort; import java.util.Random; public class All { /** * 快速排序array * * 算法:每次过程都将比关键值大的和小的分左右两边,然后两边数组再重复执行 * 1)设置两个变量I、J,排序开始的时候:I=0,J=N-1; * 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; * 3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与A[I]交换; * 4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与A[J]交换; * 5)重复第3、4步,直到I=J * * 时间复杂度:O(nlogN),每次都分成两份,次数为logN,每份的复杂度为n,故O(nlogN) */ public void quickSort(float[] array) { quickSort(array, 0, array.length - 1); } public void quickSort(float[] array, int low, int high) { float key = array[low]; int l = low, r = high; while (l < r) { while (l < r && array[r] >= key) { r--; } array[l] = array[r]; while (l < r && array[l] <= key) { l++; } array[r] = array[l]; } array[l] = key;//or array[r] = key; if (low < l - 1) { quickSort(array, low, l - 1); } if (r + 1 < high) { quickSort(array, r + 1, high); } } /** * 插入排序array * * 算法:插入排序是最简单最直观的排序算法了, * 它的依据是:遍历到第N个元素的时候前面的N-1个元素已经是排序好的了, * 那么就查找前面的N-1个元素把这第N个元素放在合适的位置, * 如此下去直到遍历完序列的元素为止。 * * 时间复杂度:O(n^2) */ public void insertSort(float[] array) { float key; int j; for (int i = 1; i < array.length; i++) { key = array[i]; for (j = i - 1; j >= 0 && array[j] > key; j--) { array[j + 1] = array[j]; } array[j + 1] = key; } } /** * 选择排序 * * 算法:首先在所有的记录中选出键值最小的记录,把它与第一个记录交换; * 然后在其余的记录中再选出键值最小的记录与第二个换; * 依此类推,直至所有记录排序完成。 * * 时间复杂度:O(n^2) */ public void selectSort(float[] array) { float key; int token; for (int i = 0; i < array.length; i++) { key = array[i]; token = i; for (int j = i; j < array.length; j++) { if (array[j] < key) { key = array[j]; token = j; } } array[token] = array[i]; array[i] = key; } } /** * 冒泡排序array * * 算法:相邻两个元素比较,将较大元素往后冒泡(或者将较小元素向前冒泡), * 第一次冒泡的结果必然将最大元素放到最后一个位置(或者将最小元素放到第一个位置), * 依次类推,直至所有记录排序完成。 * * 时间复杂度:O(n^2) */ public void bubbleSort(float[] array) { float tmp; //大数往后冒泡的思路 for (int i = 0; i < array.length; i++) { for (int j = 1; j < array.length - i; j++) { if (array[j - 1] > array[j]) { tmp = array[j - 1]; array[j - 1] = array[j]; array[j] = tmp; } } } //小数往前冒泡的思路 // for (int i = 0; i < array.length; i++) { // for (int j = array.length - 1; j > i; j--) { // if (array[j] < array[j - 1]) { // tmp = array[j - 1]; // array[j - 1] = array[j]; // array[j] = tmp; // } // } // } } /** * 堆排序 * * 算法:分两步,1,调整数组为堆;2,交换堆顶和堆尾元素,使堆尾元素最大(小); * 依次减少堆尾元素,将剩余的元素重复上面两步。 * * 注意:堆的逻辑结构是一棵完全二叉树,父节点比孩子节点都大(大顶堆)或者都小(小顶堆); * 大顶堆适用于从小到大排序,小顶堆相反; * * ps:只调整成小顶堆,不交换顶尾元素排序的思路也一定能够实现, * 但是调整堆时元素下标不是从0开始,思考起来麻烦 * * 时间复杂度:O(nlogN) */ public void heapSort(float[] array) { float tmp; for (int i = array.length; i > 0; i--) { heapAdjust(array, i); tmp = array[0]; array[0] = array[i - 1]; array[i - 1] = tmp; } } /** * 堆排序,调整堆,大顶堆 * @param array * @param len:每次调整的并不是全部数组,而是[0~(len-1)] */ public void heapAdjust(float[] array, int len) { float tmp; for (int i = len / 2 - 1; i >= 0; i--) {//根据i计算方式,一定存在左孩子 if (2 * i + 2 <= len - 1) {//存在右孩子 if (array[2 * i + 2] > array[i]) {//父节点和右孩子比较 tmp = array[2 * i + 2]; array[2 * i + 2] = array[i]; array[i] = tmp; } } if (array[2 * i + 1] > array[i]) {//父节点和左孩子比较 tmp = array[2 * i + 1]; array[2 * i + 1] = array[i]; array[i] = tmp; } } } /** * 随机生成一个Array */ public void setArray(float[] array) { for (int i = 0; i < array.length; i++) { array[i] = (new Random()).nextFloat() * 100; } } /** * 输出array数据 */ public void printArray(float[] array) { boolean b = true; System.out.print("["); for (int i = 0; i < array.length; i++) { if (b) { b = false; } else { System.out.print(","); } System.out.printf("%2.3f", array[i]); if ((i + 1) % 10 == 0 && (i + 1) != array.length) { System.out.println(); } } System.out.println("]"); } /** * main() Test * @param args */ public static void main(String[] args) { All all = new All(); int n = 50;//长度 float[] array = new float[n]; long t1, t2; //选择排序 System.out.println("selectSort before:"); all.setArray(array); all.printArray(array); t1 = System.nanoTime(); all.selectSort(array); t2 = System.nanoTime(); System.out.println("selectSort after:"); all.printArray(array); System.out.println("selectSort time:" + (t2 - t1) + "ns*****************"); //插入排序 System.out.println("insertSort before:"); all.setArray(array); all.printArray(array); t1 = System.nanoTime(); all.insertSort(array); t2 = System.nanoTime(); System.out.println("insertSort after:"); all.printArray(array); System.out.println("insertSort time:" + (t2 - t1) + "ns*****************"); //冒泡排序 System.out.println("bubbleSort before:"); all.setArray(array); all.printArray(array); t1 = System.nanoTime(); all.bubbleSort(array); t2 = System.nanoTime(); System.out.println("bubbleSort after:"); all.printArray(array); System.out.println("bubbleSort time:" + (t2 - t1) + "ns*****************"); //堆排序 System.out.println("heapSort before:"); all.setArray(array); all.printArray(array); t1 = System.nanoTime(); all.heapSort(array); t2 = System.nanoTime(); System.out.println("heapSort after:"); all.printArray(array); System.out .println("heapSort time:" + (t2 - t1) + "ns*****************"); //快速排序 System.out.println("quickSort before:"); all.setArray(array); all.printArray(array); t1 = System.nanoTime(); all.quickSort(array); t2 = System.nanoTime(); System.out.println("quickSort after:"); all.printArray(array); System.out.println("quickSort time:" + (t2 - t1) + "ns*****************"); } }