主要参考严蔚敏的数据结构中的算法来实现。如果不明白 可以查看。
还参考如下链接中的类容。
http://www.iteye.com/topic/1116214
http://www.iteye.com/topic/547734
http://www.iteye.com/topic/547735
如果想了解原理可以查看上述资料。现在就直接上代码
/** * http://www.iteye.com/topic/1116214 * http://www.iteye.com/topic/547734 * http://www.iteye.com/topic/547735 */ public class Sort { private static Sort sort = null; private Sort() { } public static Sort getInstance() { if (sort == null) { sort = new Sort(); } return sort; } private void move(int[] array, int from, int end) { for (int i = end; i >= from; i--) { array[i] = array[i - 1]; } } /** * 交换数组中的两个元素的位置 * @param array 待交换的数组 * @param i 第一个元素 * @param j 第二个元素 */ private void swap(int[] array, int i, int j) { if (i != j) {//只有不是同一位置时才需交换 int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } public void display(int[] array) { for (int i = 0; i < array.length; i++) { System.out.print(" " + array[i]); } System.out.println(); } public void insertSort(int[] array) { for (int i = 1; i < array.length; i++) { int temp = array[i]; for (int j = 0; j < i; j++) { if (array[i] < array[j]) { move(array, j, i); array[j] = temp; } } } } private void shellInsert(int[] array, int step) { for(int i = step + 1; i < array.length; i++) { if (array[i] < array[i - step]) { int temp = array[i]; int j = -1; for (j = i - step; j > 0 && temp < array[j]; j = j - step) { array[j + step] = array[j]; } array[j + step] = temp; } } } public void shellSort(int[] array, int[] steps) { for(int k = 0; k < steps.length; k++) { shellInsert(array, steps[k]); } } /* * 结束条件:在一趟排序过程中没有进行过交换记录的操作。 * **/ public void bubbleSort(int[] array) { display(array); for (int i = 0; i < array.length; i++) { boolean hasSwap = false; for (int j = 1; j < array.length - i; j++) { if (array[j] < array[j - 1]) { swap(array, j, j - 1); hasSwap = true; } } display(array); if (!hasSwap) { return; } } } /* * 交换数组中[low, high]的记录,枢轴记录到位,并返回其所在的位置。 * 此时,在它之前(后)的记录均不大(小)于它。 * **/ private int partition(int[] array, int low, int high) { int temp = array[low]; while(low < high) { while (low < high && array[high] >= temp) { --high; } array[low] = array[high]; while (low < high && array[low] <= temp) { ++low; } array[high] = array[low]; } array[low] = temp; return low; } private void qSort(int[] array, int low, int high) { if (low < high) { int mid = partition(array, low, high); qSort(array, low, mid - 1); qSort(array, mid + 1, high); } } public void quickSort(int[] array) { qSort(array, 0, array.length - 1); } public void selectSort(int[] array) { for (int i = 0; i < array.length; i++) { for (int j = i + 1; j < array.length; j++) { if (array[i] > array[j]) { swap(array, i, j); } } } } /* * n个元素的序列{k1,k2,k3,...,kn}当且仅当满足下面关系时,称之为堆。 * * ki <= k2i 且 ki <= k2i + 1 * * 或 * * ki >= 2i 且 ki >= k2i + 1 * * 可以将数组看成一个完全二叉树。 * * **/ private void heapAdjust(int array[], int start, int end) { // 已知array[start,end]中除array[start]之外均满足堆的定义,本函数调整 // array[start],使array[start, end]成为一个大顶堆。 int temp = array[start]; for (int i = 2 * start + 1; i <= end; i = i * 2 + 1) { // 沿较大的孩子节点向下筛选 if (i + 1 <= end && array[i] < array[i + 1]) { // i 为较大的记录的下标 i++; } if(temp >= array[i]) { // 如果大于两个子节点中较大的则结束。 break; } array[start] = array[i]; start = i; // temp 应该插在start } array[start] = temp; } public void heapSort(int array[]) { display(array); for (int i = (array.length -1) / 2; i >= 0; i--) { // 将数组建成大顶堆 // 从最后一个非终端节点开始 heapAdjust(array, i, array.length -1); } System.out.println("大堆: "); display(array); for (int i = array.length - 1; i > 0; i--) { swap(array, 0, i); heapAdjust(array, 0, i - 1); } } }
public class Main { static int[] array = { 10, 1, 3, 7, 5, 4, 10, 8, 9, 2, 6}; // static int[] arrayTest = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; static int[] steps = { 7, 3, 1 }; private static Sort sort = null; /** * @param args */ public static void main(String[] args) { sort = Sort.getInstance(); // 插入排序 // sort.insertSort(array); // sort.display(array); // sort.shellSort(array, steps); // sort.display(array); // 交换排序 // sort.bubbleSort(array); // sort.display(array); // sort.quickSort(array); // sort.display(array); // sort.selectSort(array); // sort.display(array); sort.heapSort(array); sort.display(array); } }后续继续更新。
作者:sylcc_ 发表于2013-5-5 20:46:29 原文链接
阅读:31 评论:0 查看评论