Java多态排序数组的各种算法 如何利用java代码封装常见的数组排序呢? 在这里我利用接口实现冒泡,选择,插入,归并,希尔,快速,基数排序数组,在TypeSortTest里,只需要修改main入口Sort s = new QuickSort()中的QuickSort类,就可以利用接口实现各种排序自由切换。
文中基数排序没有给出java代码,请各位自己尝试,如有兴趣可以排序各种对象(提示:各种对象的类可以定义同一个接口,多态操作)。代码有点复杂,如有各位更好的算法可以一起探讨。QQ:2457214635
//几种常见数组排序,实现多态操作 package com.sort; public class TypeSortTest { public static void main(String[] args) { double[] d = { 3, 2, 4, 9, 5, 11, 15, 10, 14 }; print(d); Sort s = new QuickSort(); s.sort(d); print(d); } // 打印数组 public static void print(double[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } } // // 接口,实现多种排序 interface Sort { public abstract void sort(double[] array); } // 冒泡排序 class BubbleSort implements Sort { // 冒泡算法 public void sort(double[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - 1 - i; j++) { if (array[j] > array[j + 1]) { swap(array, j, j + 1); } } } }// end method // 交换 public void swap(double[] arr, int i, int j) { double temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 选择排序 class SelectSort implements Sort { // 选择 public void sort(double[] array) { for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i + 1; j < array.length; j++) { if (array[minIndex] > array[j]) minIndex = j; }// end for swap(array, minIndex, i); } }// end method // 交换 public void swap(double[] arr, int i, int j) { double temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 插入排序 class InsertSort implements Sort {
public void sort(double[] array) {
int inner, outer; for (outer = 1; outer < array.length; outer++) { inner = outer; double temp = array[outer]; while (inner > 0 && array[inner - 1] > temp) { array[inner] = array[inner - 1]; inner--; } array[inner++] = temp;// 右移一为 } } } // 希尔排序, class ShellSort implements Sort { public void sort(double[] array) { int h = 1; while (h <= array.length / 3) { h = h * 3 + 1;// 产生h增量,选择1,4,。。。。 } while (h > 0) {// 循环h=。。。4,1 int inner, outer; for (outer = h; outer < array.length; outer++) { inner = outer; double temp = array[inner]; while (inner > h - 1 && array[inner - h] > temp) { array[inner] = array[inner - h]; inner = inner - h;// 往左移一个h增量; } array[inner] = temp; }// end for h = (h - 1) / 3;// 减少h增量直到等于1 } } } // 归并排序 class MergeSort implements Sort { public void sort(double[] array) { recMerge(array, 0, array.length - 1); }
// 归并一个左右假设有序的数组,借助另外一个数组
public void merge(double[] src, double[] workspace, int lowScan, int minScan, int upperbound) { int lowbound = lowScan; int min = minScan - 1;// 假设左右有序数组的中间值 int k = 0; int n = upperbound - lowbound + 1;// 元素个数 while (lowScan <= min && minScan <= upperbound) { if (src[lowScan] < src[minScan]) workspace[k++] = src[lowScan++]; else workspace[k++] = src[minScan++]; } while (lowScan <= min) {// 右边到头了,直接把左边赋值过去 workspace[k++] = src[lowScan++]; } while (minScan <= upperbound) {// 左边到头了,直接把右边赋值过去 workspace[k++] = src[minScan++]; } for (int i = 0; i < n; i++) {// 将数组元素赋值回去 src[lowbound + i] = workspace[i]; } } // 归并,以中间分开 public void recMerge(double[] arr, int low, int upper) { double[] workspace = new double[arr.length]; if (low - upper == 0) return;// 递归基值条件 else { int min = (low + upper) / 2; recMerge(arr, low, min);// 左边归并排序 recMerge(arr, min + 1, upper);// 右边归并排序 merge(arr, workspace, low, min + 1, upper); } } } // 快速 class QuickSort implements Sort { public void sort(double[] array) { quickSort(array, 0, array.length - 1);
}
// 快速排序 public void quickSort(double[] arr, int left, int right) { if (left >= right) { return;// 递归基值条件,最后一个停止递归 } else { double key = arr[right];// 以最右边作为关键字 int min = partion(arr, left, right, key); quickSort(arr, left, min - 1); quickSort(arr, min + 1, right); } } // 以某个关键字比较,分成左右两边,返回右边一组最左边的位置 public int partion(double[] arr, int left, int right, double key) { int leftScan = left - 1;// 从左边第0个往右扫描 int rightScan = right + 1;// 从右边最后一个开始往左扫描 while (true) {// 一直扫描知道,leftScan与rightScan相遇 while (leftScan < right && arr[++leftScan] < key) // 直到找出左边比key大 的数据停止 ; while (rightScan > left && arr[--rightScan] > key) // 直到找出右边比key小 的数据停止 ; if (leftScan >= rightScan) break;// leftScan与rightScan相遇,跳出循环 else { swap(arr, leftScan, rightScan); // 交换上面两个while循环的值 } } return leftScan;// 返回右边一组最左边的位置 } // 交换 public void swap(double[] arr, int i, int j) { double temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
// 基数排序,大家自己做
// 基数排序,按照位数大小排序,先排个位,后十位。。。。,利用二维素组
文中基数排序没有给出java代码,请各位自己尝试,如有兴趣可以排序各种对象(提示:各种对象的类可以定义同一个接口,多态操作)。代码有点复杂,如有各位更好的算法可以一起探讨。QQ:2457214635
//几种常见数组排序,实现多态操作 package com.sort; public class TypeSortTest { public static void main(String[] args) { double[] d = { 3, 2, 4, 9, 5, 11, 15, 10, 14 }; print(d); Sort s = new QuickSort(); s.sort(d); print(d); } // 打印数组 public static void print(double[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } } // // 接口,实现多种排序 interface Sort { public abstract void sort(double[] array); } // 冒泡排序 class BubbleSort implements Sort { // 冒泡算法 public void sort(double[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - 1 - i; j++) { if (array[j] > array[j + 1]) { swap(array, j, j + 1); } } } }// end method // 交换 public void swap(double[] arr, int i, int j) { double temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 选择排序 class SelectSort implements Sort { // 选择 public void sort(double[] array) { for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i + 1; j < array.length; j++) { if (array[minIndex] > array[j]) minIndex = j; }// end for swap(array, minIndex, i); } }// end method // 交换 public void swap(double[] arr, int i, int j) { double temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 插入排序 class InsertSort implements Sort {
public void sort(double[] array) {
int inner, outer; for (outer = 1; outer < array.length; outer++) { inner = outer; double temp = array[outer]; while (inner > 0 && array[inner - 1] > temp) { array[inner] = array[inner - 1]; inner--; } array[inner++] = temp;// 右移一为 } } } // 希尔排序, class ShellSort implements Sort { public void sort(double[] array) { int h = 1; while (h <= array.length / 3) { h = h * 3 + 1;// 产生h增量,选择1,4,。。。。 } while (h > 0) {// 循环h=。。。4,1 int inner, outer; for (outer = h; outer < array.length; outer++) { inner = outer; double temp = array[inner]; while (inner > h - 1 && array[inner - h] > temp) { array[inner] = array[inner - h]; inner = inner - h;// 往左移一个h增量; } array[inner] = temp; }// end for h = (h - 1) / 3;// 减少h增量直到等于1 } } } // 归并排序 class MergeSort implements Sort { public void sort(double[] array) { recMerge(array, 0, array.length - 1); }
// 归并一个左右假设有序的数组,借助另外一个数组
public void merge(double[] src, double[] workspace, int lowScan, int minScan, int upperbound) { int lowbound = lowScan; int min = minScan - 1;// 假设左右有序数组的中间值 int k = 0; int n = upperbound - lowbound + 1;// 元素个数 while (lowScan <= min && minScan <= upperbound) { if (src[lowScan] < src[minScan]) workspace[k++] = src[lowScan++]; else workspace[k++] = src[minScan++]; } while (lowScan <= min) {// 右边到头了,直接把左边赋值过去 workspace[k++] = src[lowScan++]; } while (minScan <= upperbound) {// 左边到头了,直接把右边赋值过去 workspace[k++] = src[minScan++]; } for (int i = 0; i < n; i++) {// 将数组元素赋值回去 src[lowbound + i] = workspace[i]; } } // 归并,以中间分开 public void recMerge(double[] arr, int low, int upper) { double[] workspace = new double[arr.length]; if (low - upper == 0) return;// 递归基值条件 else { int min = (low + upper) / 2; recMerge(arr, low, min);// 左边归并排序 recMerge(arr, min + 1, upper);// 右边归并排序 merge(arr, workspace, low, min + 1, upper); } } } // 快速 class QuickSort implements Sort { public void sort(double[] array) { quickSort(array, 0, array.length - 1);
}
// 快速排序 public void quickSort(double[] arr, int left, int right) { if (left >= right) { return;// 递归基值条件,最后一个停止递归 } else { double key = arr[right];// 以最右边作为关键字 int min = partion(arr, left, right, key); quickSort(arr, left, min - 1); quickSort(arr, min + 1, right); } } // 以某个关键字比较,分成左右两边,返回右边一组最左边的位置 public int partion(double[] arr, int left, int right, double key) { int leftScan = left - 1;// 从左边第0个往右扫描 int rightScan = right + 1;// 从右边最后一个开始往左扫描 while (true) {// 一直扫描知道,leftScan与rightScan相遇 while (leftScan < right && arr[++leftScan] < key) // 直到找出左边比key大 的数据停止 ; while (rightScan > left && arr[--rightScan] > key) // 直到找出右边比key小 的数据停止 ; if (leftScan >= rightScan) break;// leftScan与rightScan相遇,跳出循环 else { swap(arr, leftScan, rightScan); // 交换上面两个while循环的值 } } return leftScan;// 返回右边一组最左边的位置 } // 交换 public void swap(double[] arr, int i, int j) { double temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
// 基数排序,大家自己做
// 基数排序,按照位数大小排序,先排个位,后十位。。。。,利用二维素组