JAVA实现常见简单排序算法
2016-09-08 22:30
507 查看
常见的简单排序算法的相关数据:
排序方法 | 时间复杂度(无特殊说明都是指最差情况) | 空间复杂度 | 稳定性 |
---|---|---|---|
冒泡排序 | O(N^2) | O(1) | 稳定 |
插入排序 | O(N^2) | O(1) | 稳定 |
选择排序 | O(N^2) | O(1) | 不稳定 |
希尔排序 | O(NlogN) | O(1) | 不稳定 |
快速排序 | 平均O(NlogN),最差O(N^2) | O(NlogN) | 不稳定 |
归并排序 | O(NlogN) | O(N) | 稳定 |
堆排序 | O(NlogN) | O(1) | 不稳定 |
桶排序 | O(N) | O(K) | 稳定 |
基数排序 | O(dN),d为常数 | O(N) | 稳定 |
部分排序算法的Java代码实现:
冒泡排序:
/** * 冒泡 * * @param arr */ public static void bubbleSort(int arr[]) { if (arr == null) return; int len = arr.length; for (int i = len - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); } } } }
选择排序:
/** * 选择 * @param arr */ public static void selectSort(int arr[]) { if (arr == null) return; int len = arr.length; for (int i = 0; i < len - 1; i++) { for (int j = i + 1; j < len; j++) { if (arr[i] > arr[j]) swap(arr, i, j); } } }
插入排序:
/** * 插入 * @param arr */ public static void insertSort(int arr[]) { if (arr == null) return; int len = arr.length; for (int i = 1; i < len; i++) { for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) { swap(arr, j, j - 1); } } }
二分排序(属于插入排序的一种优化):
/** * 二分 * @param arr */ public static void binarySort(int arr[]) { if (arr == null) return; int len = arr.length; for (int i = 1; i < len; i++) { int left = 0; int right = i - 1; int tmp = arr[i]; while (left <= right) { int mid = (left + right) >>> 1; if (arr[mid] > tmp) { right = mid - 1; } else { left = mid + 1; } } for (int j = i - 1; j >= left; j--) { arr[j + 1] = arr[j]; } arr[left] = tmp; } }
希尔排序(实质是分组插入排序):
/** * 希尔 * @param arr */ public static void shellSort(int arr[]) { if (arr == null) return; int increment = arr.length; int tmp = 0; do { increment = increment / 3 + 1; for (int i = increment; i < len; i++) { if (arr[i] < arr[i - increment]) { tmp = arr[i]; int j = i - increment; do { arr[j + increment] = arr[j]; j = j - increment; } while (j > 0 && arr[j] > tmp); arr[j + increment] = tmp; } } } while (increment > 1); }
快速排序:
/** * 快排 * @param arr * @param low * @param high */ public static void quickSort(int arr[], int low, int high) { if (arr == null) throw new IllegalArgumentException("parameter arr can not be null"); if (low >= high) return; int i = low; int j = high; int pivot = arr[i]; // partition while (i < j) { while (i < j && arr[j] > pivot) j--; if (i < j) arr[i++] = arr[j]; while (i < j && arr[i] <= pivot) i++; if (i < j) arr[j--] = arr[i]; } arr[j] = pivot; quickSort(arr, low, j - 1); quickSort(arr, j + 1, high); }
归并排序:
/** * 归并 * @param arr * @param low * @param high */ public static void mergeSort(int arr[], int low, int high) { if (arr == null) throw new IllegalArgumentException("parameter arr can not be null"); if (low < high) { int mid = (low + high) >>> 1; mergeSort(arr, low, mid); mergeSort(arr, mid + 1, high); merge(arr, low, mid, mid + 1, high); } } private static void merge(int arr[], int start1, int end1, int start2, int end2) { int i = start1; int j = start2; int k = 0; int tmp[] = new int[end2 - start1 + 1]; while (i <= end1 && j <= end2) { if (arr[i] <= arr[j]) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } while (i <= end1) { tmp[k++] = arr[i++]; } while (j <= end2) { tmp[k++] = arr[j++]; } // 复制到原数组中 k = start1; for (; k <= end2; k++) { arr[k] = tmp[k - start1]; } }
堆排序:
/** * 堆排序 * 升序创建大根堆,降序创建小根堆 * @param arr */ public static void heapSort(int arr[]) { if (arr == null) throw new IllegalArgumentException("parameter arr can not be null"); //创建大根堆 int len = arr.length; for (int i = len / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, len); } for (int i = len - 1; i > 0; i--) { swap(arr, i, 0); adjustHeap(arr, 0, i); } } private static void adjustHeap(int arr[], int index, int n) { int i = index; int tmp = arr[i]; int j = 2 * i + 1; while(j < n) { if (j + 1 < n && arr[j + 1] > arr[j]) j++; if (arr[j] <= tmp) break; arr[i] = arr[j]; i = j; j = 2 * i + 1; } arr[i] = tmp; }
相关文章推荐
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法
- 常见经典排序算法的java实现
- java实现简单的排序算法
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法
- 几种排序算法java简单实现
- 常见排序算法及其java实现
- 常见内部排序算法 简单数组实现与分析(快速(偶原创partition函数,望众高手指正)、归并、希尔、插入、选择、冒泡)
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法及SortUtil
- 黑马程序员——Java基础语法:几种简单的排序算法的实现
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法-Java基础-Java-编程开发
- 常见排序算法的java实现
- 常见排序算法的java实现