排序算法java实现
来源:互联网 发布:php hmacsha256 编辑:程序博客网 时间:2024/05/20 00:16
- 排序算法java实现
- 插入排序类
- 直接插入排序
- 希尔排序
- 选择排序类
- 简单选择排序
- 堆排序
- 交换排序类
- 冒泡排序
- 快速排序
- 归并排序类
- 归并排序
- 附工具类
- 插入排序类
- 排序算法java实现
排序算法java实现
https://github.com/xiaoyinliuyun/AlgorithmSortTest
插入排序类:
直接插入排序
public class InsertionSorter {// 4,6,2,1,7,9,8,0,5,3,// 4,6,2,1,7,9,8,0,5,3,// 2,4,6,1,7,9,8,0,5,3,// 1,2,4,6,7,9,8,0,5,3,// 1,2,4,6,7,9,8,0,5,3,// 1,2,4,6,7,9,8,0,5,3,// 1,2,4,6,7,8,9,0,5,3,// 0,1,2,4,6,7,8,9,5,3,// 0,1,2,4,5,6,7,8,9,3,// 0,1,2,3,4,5,6,7,8,9, /** * 插入排序 O(n^2) O(n) O(n^2) * 最好的情况:要排序的表本身就是有序的 比较n-1次 移动0次 * 最坏的情况:待排序表是逆序的 比较(n+2)(n-1)/2次 移动(n+4)(n-1)/2次 * 随机情况:平均比较和移动次数 (n^2)/4 * * 直接插入排序比冒泡和简单选择排序的性能要好一些 * * @param a * @param <AnyType> */ public static <AnyType extends Comparable<? super AnyType>> void sort(AnyType[] a) { ArrayUtils.printArray(a); int j = 0; for (int p = 1; p < a.length; p++) { AnyType tmp = a[p]; for (j = p; j > 0 && tmp.compareTo(a[j - 1]) < 0; j--) { a[j] = a[j - 1]; } a[j] = tmp;// ArrayUtils.printArray(a); } } public static <AnyType extends Comparable<? super AnyType>> void sort(AnyType[] a, int left, int right) { int j = 0; for (int p = left + 1; p < right + 1; p++) { AnyType tmp = a[p]; for (j = p; j > left && tmp.compareTo(a[j - 1]) < 0; j--) { a[j] = a[j - 1]; } a[j] = tmp; } ArrayUtils.printArray(a); }}
希尔排序
public class ShellSorter { /** * 希尔排序 O(n^1.25) * * @param a * @param <AnyType> */ public static <AnyType extends Comparable<? super AnyType>> void sort(AnyType[] a) { int j = 0; for (int gap = a.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < a.length; i++) { AnyType tmp = a[i]; for (j = i; j >= gap && tmp.compareTo(a[j - gap]) < 0; j -= gap) { a[j] = a[j - gap]; } a[j] = tmp; } }// printArray(a); }}
选择排序类
简单选择排序
public class SimpleSelectSorter {// 0,6,2,1,7,9,8,4,5,3,// 0,1,2,6,7,9,8,4,5,3,// 0,1,2,6,7,9,8,4,5,3,// 0,1,2,3,7,9,8,4,5,6,// 0,1,2,3,4,9,8,7,5,6,// 0,1,2,3,4,5,8,7,9,6,// 0,1,2,3,4,5,6,7,9,8,// 0,1,2,3,4,5,6,7,9,8,// 0,1,2,3,4,5,6,7,8,9,// 0,1,2,3,4,5,6,7,8,9, /** * 简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 稳定 * <p/> * 基本思想 每一趟在 n - i + 1 (i = 1,2,...,n-1) 个记录中选取关键字最小的记录作为 有序序列的第i个记录 * <p/> * 特点 交换移动的数据相当少 性能上略优于冒泡排序 * 关键字信息量较大时,优势明显(因为移动的次数少) * <p/> * 比较:第i趟排序需要进行n-i次关键字的比较 无论最好最差情况比较次数一样多 n(n-1)/2次 * 交换:最好的时候交换 0 次 最差的时候交换 n-1次 * * @param a * @param <AnyType> */ public static <AnyType extends Comparable<? super AnyType>> void sort(AnyType[] a) { for (int i = 0, min = 0; i < a.length; i++) { min = i; for (int j = i + 1; j < a.length; j++) { if (a[min].compareTo(a[j]) > 0) { min = j; } } if (i != min) { ArrayUtils.swapReferences(a, i, min); }// ArrayUtils.printArray(a); } }}
堆排序
public class HeapSorter { public static void heapSort(int[] array) { if (array == null || array.length <= 1) { return; } buildMaxHeap(array); for (int i = array.length - 1; i >= 1; i--) { ArrayUtils.exchangeElements(array, 0, i); maxHeap(array, i, 0); } } private static void buildMaxHeap(int[] array) { if (array == null || array.length <= 1) { return; } int half = array.length / 2; for (int i = half; i >= 0; i--) { maxHeap(array, array.length, i); } } private static void maxHeap(int[] array, int heapSize, int index) { int left = index * 2 + 1; int right = index * 2 + 2; int largest = index; if (left < heapSize && array[left] > array[index]) { largest = left; } if (right < heapSize && array[right] > array[largest]) { largest = right; } if (index != largest) { ArrayUtils.exchangeElements(array, index, largest); maxHeap(array, heapSize, largest); } } /** * 堆排序方法 O(nlogn) O(nlogn) O(nlogn) O(1)不稳定 不适合序列个数较少的情况 * * 对空间要求很少 * * @param a * @param <AnyType> */ public static <AnyType extends Comparable<? super AnyType>> void sort(AnyType[] a) { for (int i = a.length / 2 - 1; i >= 0; i--) { percDown(a, i, a.length); } for (int i = a.length - 1; i > 0; i--) { swapReferences(a, 0, i); percDown(a, 0, i); } } private static <AnyType extends Comparable<? super AnyType>> void swapReferences(AnyType[] a, int i, int i1) { AnyType temp = a[i]; a[i] = a[i1]; a[i1] = temp; } private static <AnyType extends Comparable<? super AnyType>> void percDown(AnyType[] a, int i, int n) { int child = 0; AnyType tmp = null; for (tmp = a[i]; leftChild(i) < n; i = child) { child = leftChild(i); if (child != n - 1 && a[child].compareTo(a[child + 1]) < 0) { child++; } if (tmp.compareTo(a[child]) < 0) { a[i] = a[child]; } else { break; } } a[i] = tmp; } private static int leftChild(int i) { return 2 * i + 1; }}
交换排序类
冒泡排序
public class BubbleSorter {// 4,6,2,1,7,9,8,0,3,5,// 4,6,2,1,7,9,0,8,3,5,// 4,6,2,1,7,0,9,8,3,5,// 4,6,2,1,0,7,9,8,3,5,// 4,6,2,0,1,7,9,8,3,5,// 4,6,0,2,1,7,9,8,3,5,// 4,0,6,2,1,7,9,8,3,5,// 0,4,6,2,1,7,9,8,3,5,// --------------------------// 0,4,6,2,1,7,9,3,8,5,// 0,4,6,2,1,7,3,9,8,5,// 0,4,6,2,1,3,7,9,8,5,// 0,4,6,1,2,3,7,9,8,5,// 0,4,1,6,2,3,7,9,8,5,// 0,1,4,6,2,3,7,9,8,5,// --------------------------// 0,1,4,6,2,3,7,9,5,8,// 0,1,4,6,2,3,7,5,9,8,// 0,1,4,6,2,3,5,7,9,8,// 0,1,4,2,6,3,5,7,9,8,// 0,1,2,4,6,3,5,7,9,8,// --------------------------// 0,1,2,4,6,3,5,7,8,9,// 0,1,2,4,3,6,5,7,8,9,// 0,1,2,3,4,6,5,7,8,9,// --------------------------// 0,1,2,3,4,5,6,7,8,9,// --------------------------// -------------------------- /** * 冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定 * <p/> * 排序思想 两两比较相邻记录 * 最好情况:本身是有序的 比较n-1次 * 最坏情况:本身是逆序的 比较n(n-1)/2次 * <p/> * 适用于基本有序的序列或数据量小的 * * @param a * @param <AnyType> */ public static <AnyType extends Comparable<? super AnyType>> void sort(AnyType[] a) {// int count = 0; boolean flag = true; for (int i = 0; i < a.length && flag; i++) { flag = false; for (int j = a.length - 1 - 1; j >= i; j--) { if (a[j].compareTo(a[j + 1]) > 0) { ArrayUtils.swapReferences(a, j, j + 1);// ArrayUtils.printArray(a); flag = true;// count++; } }// System.out.println("--------------------------"); }// for (int i = 0; i < a.length; i++) {// for (int j = 0; j < a.length - 1 - i; j++) {// if (a[j].compareTo(a[j + 1]) > 0) {// ArrayUtils.swapReferences(a, j, j + 1);// ArrayUtils.printArray(a);// count++;// }// }// }// System.out.println(count); }}
快速排序
public class BubbleSorter {// 4,6,2,1,7,9,8,0,3,5,// 4,6,2,1,7,9,0,8,3,5,// 4,6,2,1,7,0,9,8,3,5,// 4,6,2,1,0,7,9,8,3,5,// 4,6,2,0,1,7,9,8,3,5,// 4,6,0,2,1,7,9,8,3,5,// 4,0,6,2,1,7,9,8,3,5,// 0,4,6,2,1,7,9,8,3,5,// --------------------------// 0,4,6,2,1,7,9,3,8,5,// 0,4,6,2,1,7,3,9,8,5,// 0,4,6,2,1,3,7,9,8,5,// 0,4,6,1,2,3,7,9,8,5,// 0,4,1,6,2,3,7,9,8,5,// 0,1,4,6,2,3,7,9,8,5,// --------------------------// 0,1,4,6,2,3,7,9,5,8,// 0,1,4,6,2,3,7,5,9,8,// 0,1,4,6,2,3,5,7,9,8,// 0,1,4,2,6,3,5,7,9,8,// 0,1,2,4,6,3,5,7,9,8,// --------------------------// 0,1,2,4,6,3,5,7,8,9,// 0,1,2,4,3,6,5,7,8,9,// 0,1,2,3,4,6,5,7,8,9,// --------------------------// 0,1,2,3,4,5,6,7,8,9,// --------------------------// -------------------------- /** * 冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定 * <p/> * 排序思想 两两比较相邻记录 * 最好情况:本身是有序的 比较n-1次 * 最坏情况:本身是逆序的 比较n(n-1)/2次 * <p/> * 适用于基本有序的序列或数据量小的 * * @param a * @param <AnyType> */ public static <AnyType extends Comparable<? super AnyType>> void sort(AnyType[] a) {// int count = 0; boolean flag = true; for (int i = 0; i < a.length && flag; i++) { flag = false; for (int j = a.length - 1 - 1; j >= i; j--) { if (a[j].compareTo(a[j + 1]) > 0) { ArrayUtils.swapReferences(a, j, j + 1);// ArrayUtils.printArray(a); flag = true;// count++; } }// System.out.println("--------------------------"); }// for (int i = 0; i < a.length; i++) {// for (int j = 0; j < a.length - 1 - i; j++) {// if (a[j].compareTo(a[j + 1]) > 0) {// ArrayUtils.swapReferences(a, j, j + 1);// ArrayUtils.printArray(a);// count++;// }// }// }// System.out.println(count); }}
归并排序类
归并排序
public class MergeSorter { /** * 归并排序方法 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定 * * 对空间复杂度有要求 * * @param a * @param <AnyType> */ public static <AnyType extends Comparable<? super AnyType>> void sort(AnyType[] a) { AnyType[] tmpArray = (AnyType[]) new Comparable[a.length]; mergeSort(a, tmpArray, 0, a.length - 1); } private static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType[] a, AnyType[] tmpArray, int left, int right) { if (left < right) { int center = (left + right) / 2; mergeSort(a, tmpArray, left, center); mergeSort(a, tmpArray, center + 1, right); merge(a, tmpArray, left, center + 1, right); } } private static <AnyType extends Comparable<? super AnyType>> void merge(AnyType[] a, AnyType[] tmpArray, int leftPos, int rightPos, int rightEnd) { int leftEnd = rightPos - 1; int tmpPos = leftPos; int numElements = rightEnd - leftPos + 1; //Main loop while (leftPos <= leftEnd && rightPos <= rightEnd) { if (a[leftPos].compareTo(a[rightPos]) <= 0) { tmpArray[tmpPos++] = a[leftPos++]; } else { tmpArray[tmpPos++] = a[rightPos++]; } } while (leftPos <= leftEnd) {//拷贝上一半的副本 tmpArray[tmpPos++] = a[leftPos++]; } while (rightPos <= rightEnd) {//拷贝另一半的副本 tmpArray[tmpPos++] = a[rightPos++]; } for (int i = 0; i < numElements; i++, rightEnd--) { a[rightEnd] = tmpArray[rightEnd]; } }}
附工具类
public class ArrayUtils { public static void exchangeElements(int[] array, int index1, int index2) { int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } public static <AnyType extends Comparable<? super AnyType>> void swapReferences(AnyType[] a, int i, int i1) { AnyType temp = a[i]; a[i] = a[i1]; a[i1] = temp; } public static <AnyType extends Comparable<? super AnyType>> void printArray(AnyType[] a) { for (int i = 0; i < a.length; i++) { System.out.print(a[i] + ","); } System.out.println(); } public static void printArray(int[] array) { System.out.print("{"); for (int i = 0; i < array.length; i++) { System.out.print(array[i]); if (i < array.length - 1) { System.out.print(", "); } } System.out.println("}"); }}
阅读全文
0 0
- 排序算法java实现
- java算法:排序实现
- 排序算法Java实现
- java实现排序算法
- 排序算法(java实现)
- 排序算法Java实现
- 排序算法Java实现
- Java排序算法实现
- java排序算法实现
- java实现排序算法
- 排序算法 java实现
- 排序算法Java实现
- java实现排序算法
- 排序算法java实现
- java实现排序算法
- java 排序算法实现
- Java实现排序算法
- 排序算法java实现
- Leetcode 300. Longest Increasing Subsequence
- Linux下QT中执行shell命令
- 多属性决策
- 监督学习与无监督学习
- 动态代码创建布局
- 排序算法java实现
- 软件测试专用名词
- LeetCode
- 数学-初等-完全平方(和)差公式
- windows 多线程: CreateThread、_beginthread、_beginthreadex、AfxBeginThread 的区别
- 搜索专题: HDU1026Ignatius and the Princess I
- HDU 1541 & POJ 2352 Stars (树状数组)
- 【纯吐槽】
- [占坑,暂时只写了大纲!] 凸优化笔记----2017 HIT 暑期学校学到的一点儿东西