/**(转) * 冒(冒泡)择(选择) 路(插入) 兮(希尔) 快(快速) 归(归并) 堆(堆排序) * @Class:Sort.java * @Description:冒(冒泡)择(选择) 路(插入) 兮(希尔) 快(快速) 归(归并) 堆(堆排序) */ public class Sort { // 待排数组 private static int[] input = new int[] { 2, 1, 5, 4, 9, 8, 6, 7, 10, 3 }; private static long swapcount = 0; private static long loopcount = 0; /** * 获取随机整数数组 * * @param arrayLength * @param maxNum * @return */ private static int[] getRandomArray(int arrayLength, int maxNum) { int[] array = new int[arrayLength]; for (int i = 0; i < array.length; i++) { array[i] = (int) (Math.random() * maxNum); } return array; } /** * 打印数组 */ private static void printArray(int[] array) { for (int i = 0; i < array.length; i++) { System.out.println(i + 1 + ":" + array[i]); } } public static void print(int[] data) { for (int i = 0; i < data.length; i++) { System.out.print(data[i] + "\t"); } System.out.println(); } private static void printArray() { for (int i : input) { System.out.print(i + " "); } } /** * 交换数值 * * @param array * @param i * @param j */ private static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } private static void resetCount() { swapcount = 0; loopcount = 0; } /** * 插入排序 * * @param array * @return */ private static int[] insertSort(int[] array) { // 与前边排序好的子序列比较,向前依次比较相邻元素,将元素推到正确位置 for (int i = 0; i < array.length; i++) { for (int j = i; j > 0 && array[j] < array[j - 1]; j--) { swap(array, j, j - 1); loopcount++; swapcount++; } } return array; } /** * 冒泡排序 * * @param array * @return */ private static int[] bubbleSort(int[] array) { // 从头开始向后依次比较相邻元素,将最大值推到数组尾部 for (int i = 0; i < array.length - 1; i++) { for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { swap(array, j, j + 1); swapcount++; } loopcount++; } } return array; } /** * 选择排序 * * @param array * @return */ private static int[] selectionSort(int[] array) { // 每次循环找出相对最小值,并交换到头部 for (int i = 0; i < array.length - 1; i++) { int lowIndex = i; for (int j = i; j < array.length; j++) { if (array[j] < array[lowIndex]) lowIndex = j; loopcount++; } swap(array, lowIndex, i); swapcount++; } return array; } /** * 希尔排序 * @param data */ public static void shellSort(int[] data) { // 计算出最大的h值 int h = 1; while (h <= data.length / 3) { h = h * 3 + 1; } while (h > 0) { for (int i = h; i < data.length; i += h) { if (data[i] < data[i - h]) { int tmp = data[i]; int j = i - h; while (j >= 0 && data[j] > tmp) { data[j + h] = data[j]; j -= h; } data[j + h] = tmp; print(data); } } // 计算出下一个h值 h = (h - 1) / 3; } } /** * 快速排序 伪代码: QUICKSORT(A, p, r) 1 if p < r 2 then q ← PARTITION(A, p, r) 3 * QUICKSORT(A, p, q - 1) 4 QUICKSORT(A, q + 1, r) * * PARTITION(A, p, r) 1 x ← A[r] 2 i ← p - 1 3 for j ← p to r - 1 4 do if * A[j] ≤ x 5 then i ← i + 1 6 exchange A[i] ↔ A[j] 7 exchange A[i + 1] ↔ * A[r] 8 return i + 1 复杂度,最坏情况下:Θ(n^2) 一般平衡情况:Θ(nlgn) * * @param array * 待排数组 * @param from * 起始位置 * @param to * 终止位置 */ private static void quickSort(int[] array, int from, int to) { if (from < to) { int temp = array[to]; int i = from - 1; for (int j = from; j < to; j++) { if (array[j] <= temp) { i++; int tempValue = array[j]; array[j] = array[i]; array[i] = tempValue; } } array[to] = array[i + 1]; array[i + 1] = temp; quickSort(array, from, i); quickSort(array, i + 1, to); } } /** * 归并排序算法===================================== * @param list * @param length */ public static void mergeSort(int[] list, int length) { int[] temp = new int[length];// 临时数组 recMergeSort(list, temp, 0, length - 1); } /** * 递归分割数据到基本单位 * @param list * @param temp * @param low * @param upper */ private static void recMergeSort(int[] list, int[] temp, int low, int upper) { if (low == upper) { return; } else { int mid = (low + upper) / 2; recMergeSort(list, temp, low, mid); recMergeSort(list, temp, mid + 1, upper); merge(list, temp, low, mid + 1, upper); } } /** * 归并操作将基本单位归并成整个有序的数组 * @param list * @param temp * @param left * @param right * @param last */ private static void merge(int[] list, int[] temp, int left, int right, int last) { int j = 0; int lowIndex = left; int mid = right - 1; int n = last - lowIndex + 1; while (left <= mid && right <= last) { if (list[left] < list[right]) { temp[j++] = list[left++]; } else { temp[j++] = list[right++]; } } while (left <= mid) { temp[j++] = list[left++]; } while (right <= last) { temp[j++] = list[right++]; } for (j = 0; j < n; j++) { list[lowIndex + j] = temp[j]; } } /** * 堆排序================================= * @param a */ public static void HeapSort(int[] a) { int n = a.length; int temp = 0; Display(a, "Before sort : "); for (int i = n / 2; i > 0; i--) Adjust(a, i - 1, n); for (int i = n - 2; i >= 0; i--) { temp = a[i + 1]; a[i + 1] = a[0]; a[0] = temp; Adjust(a, 0, i + 1); } Display(a, "After sort : "); } public static void Adjust(int[] a, int i, int n) { int j = 0; int temp = 0; temp = a[i]; j = 2 * i + 1; while (j <= n - 1) { if (j < n - 1 && a[j] < a[j + 1]) j++; if (temp >= a[j]) break; a[(j - 1) / 2] = a[j]; j = 2 * j + 1; } a[(j - 1) / 2] = temp; } public static void Display(int[] a, String str) { System.out.println(str); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } //堆排序================================= public static void main(String[] args) { int[] array = Sort.getRandomArray(100, 1000); Sort.printArray(array); System.out.println("------------------------"); System.out.println("以上为初始数组"); System.out.println("------------------------"); /** * 插入排序 */ int[] insertArray = array.clone(); Sort.resetCount(); Sort.insertSort(insertArray); Sort.printArray(insertArray); System.out.println("------------------------"); System.out.println("insertSort交换次数为:" + swapcount); System.out.println("insertSort循环次数为:" + loopcount); System.out.println("------------------------"); // 冒泡排序 int[] bubbleArray = array.clone(); Sort.resetCount(); Sort.bubbleSort(bubbleArray); Sort.printArray(bubbleArray); System.out.println("------------------------"); System.out.println("bubbleSort交换次数为:" + swapcount); System.out.println("bubbleSort循环次数为:" + loopcount); System.out.println("------------------------"); /** * 选择排序 */ int[] selectionArray = array.clone(); Sort.resetCount(); Sort.selectionSort(selectionArray); Sort.printArray(selectionArray); System.out.println("------------------------"); System.out.println("selectionSort交换次数为:" + swapcount); System.out.println("selectionSort循环次数为:" + loopcount); System.out.println("------------------------"); /** * 希尔排序 */ int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; print(data); shellSort(data); print(data); /** * 快速排序 */ quickSort(input, 0, input.length - 1); // 打印数组 printArray(); /** * 归并排序 */ int arr[] = { 2, 568, 34, 46, 9, 23, 89, 43, 572, 684, 783, 543 }; mergeSort(arr, 12); for (int i = 0; i < 12; i++) { System.out.print(arr[i] + ","); } /** * 堆排序 */ int[] a = { 26, 5, 77, 1, 61, 11, 59, 15, 48, 19 }; HeapSort(a); } }
相关推荐
1. 选择排序 2. 冒泡排序 3. 插入排序 4. 希尔排序 5. 堆排序 6. 归并排序 7. 快速排序 8. 基数排序 9. 计数排序 10. 桶排序 十种排序代码 我的博文地址:...
冒泡排序,选择排序,直接插入排序,希尔排序,快速排序,堆排序,归并排序 ,基数排序。可直接运行的控制台程序
4. 希尔排序(Shell Sort):希尔排序是插入排序的一种优化版本,通过间隔序列(也称为增量序列)减少元素间的比较距离,从而提高效率。其平均时间复杂度介于O(n)到O(n^2)之间。 5. 快速排序(Quick Sort):快速...
根据给定的信息,本文将对九种不同的排序算法进行详细解析:选择排序、插入排序、冒泡排序、希尔排序、快速排序、箱子排序(计数排序)、基数排序、归并排序以及堆排序。 ### 一、选择排序 选择排序的基本思想是...
基于C语言实现常见算法源码(冒泡、选择、直接插入、希尔、堆、归并、快速优化排序等).zip基于C语言实现常见算法源码(冒泡、选择、直接插入、希尔、堆、归并、快速优化排序等).zip 【优质项目推荐】 1.项目代码完整...
希尔排序是基于插入排序的以下事实而提出:插入排序对于少量的数据能很好地工作。希尔排序通过先取一个相对大的增量进行排序,然后逐渐减小增量,直到增量为1时变为普通的插入排序。 **算法步骤:** 1. 选择一个...
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法
本篇文章将深入探讨标题和描述中提到的九大排序算法:快速排序、冒泡排序、堆排序、希尔排序、直接插入排序、直接选择排序、基数排序、箱排序和桶排序。 1. **快速排序**:快速排序是一种基于分治策略的排序算法,...
java编程十大排序算法,包括冒泡,选择,插入,归并,快速,希尔,堆,桶,计数,基数排序_Top-Ten-Sorting-Algorithm
java版八大排序(冒泡、选择、插入、堆、希尔、归并、快速、基数)_Sort-Java
冒泡排序、选择排序、快速排序、堆排序、插入排序、希尔排序、归并排序 冒泡排序、选择排序、快速排序、堆排序、插入排序、希尔排序、归并排序 冒泡排序、选择排序、快速排序、堆排序、插入排序、希尔排序、归并排序...
选择排序 冒泡排序 插入排序 希尔排序 堆排序 归并排序 快速排序 基数排序 计数排序 桶排序 我的博客地址:http://blog.csdn.net/u010156024/article/details/48932219
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
排序算法的合集以及其Java代码实现。包括:冒泡、选择、插入、希尔、归并、快排、堆排序、计数排序、桶_SortingAlgorithms
以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...
以下是关于"插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序"这十大经典排序算法的详细解释: 1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序...
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
本篇文章将深入探讨几种常见的排序算法的C++实现,包括冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,它通过重复遍历待排序的数列,依次比较...
这里我们详细探讨一下标题和描述中提到的几种排序算法:冒泡排序、选择排序、快速排序、归并排序、插入排序、折半插入排序、希尔排序以及堆排序。 1. **冒泡排序**:冒泡排序是一种简单的交换排序方法。它通过不断...