java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
来源:互联网 发布:阿里云电视猫 编辑:程序博客网 时间:2024/04/30 07:36
前言
经过两个月的各种笔试面试,对各种基础排序算法原理了然于胸,用c闭着眼都能写出完美ac的代码来,今天刚看完java的数组,忍不住用java将各种排序实现一遍
注意,这篇文章只是为了锻炼java语法,不会深入讲各种排序原理,有兴趣的同学可以看我之前的博客,各自排序我都用c讲的非常清楚了
冒泡排序
public static void bubbleSort(int A[], int n) {int i, j;for (i = 0; i < n - 1; i ++) {for (j = 0; j < n - i - 1; j ++) {if (A[j] > A[j + 1]) {A[j] = A[j] ^ A[j + 1];A[j + 1] = A[j] ^ A[j + 1];A[j] = A[j] ^ A[j + 1];}}}}
直接插入排序
public static void insertSort(int A[], int n) {int i, j, tmp;for (i = 1; i < n; i++) {tmp = A[i];for (j = i - 1; j >= 0; j--) {if (A[j] > tmp) {A[j + 1] = A[j];} else {break;}}A[j + 1] = tmp;}}
直接选择排序
public static void selectSort(int A[], int n) {int i, j, loc;for (i = 0; i < n; i++) {loc = i;for (j = i + 1; j < n; j++) {if (A[j] < A[loc]) {loc = j;}}if (loc != i) {A[i] = A[i] ^ A[loc];A[loc] = A[i] ^ A[loc];A[i] = A[i] ^ A[loc];}}}
堆排序
/** * 堆排序(从小到大) * * @param A * @param n */public static void heapSort(int A[], int n) {int tmp;// 构建大根堆buildMaxHeap(A, n);for (int j = n - 1; j >= 1; j--) {tmp = A[0];A[0] = A[j];A[j] = tmp;maxheapIfy(A, 0, j);}}/** * 构建大根堆 * * @param A * @param n */private static void buildMaxHeap(int A[], int n) {for (int i = (n - 2) / 2; i >= 0; i--) {maxheapIfy(A, i, n);}}/** * 维护从下标i开始的最大堆 * * @param A * @param i * @param n */private static void maxheapIfy(int A[], int i, int n) {int left, right, loc;while (i < n) {left = 2 * i + 1;right = 2 * i + 2;loc = i;if (left < n && A[left] > A[i]) {i = left;}if (right < n && A[right] > A[i]) {i = right;}if (loc != i) {A[i] = A[loc] ^ A[i];A[loc] = A[loc] ^ A[i];A[i] = A[loc] ^ A[i];} else {break;}}}
快速排序
public static void quickSort(int A[], int bt, int ed) {if (bt < ed) {int pivot = pivotPartition(A, bt, ed);quickSort(A, bt, pivot - 1);quickSort(A, pivot + 1, ed);}}private static void swapVar(int A[], int bt, int ed) {int mid = bt + (ed - bt) / 2;if (mid != bt) {A[bt] = A[bt] ^ A[mid];A[mid] = A[bt] ^ A[mid];A[bt] = A[bt] ^ A[mid];}}private static int pivotPartition(int A[], int bt, int ed) {// 取中间值作为stand,防止数组有序出现O(n^2)情况swapVar(A, bt, ed);int stand = A[bt];while (bt < ed) {while (bt < ed && A[ed] >= stand) {ed--;}if (bt < ed) {A[bt++] = A[ed];}while (bt < ed && A[bt] <= stand) {bt++;}if (bt < ed) {A[ed--] = A[bt];}}A[bt] = stand;return bt;}
归并排序
public static void mergeSort(int A[], int bt, int ed) {if (bt < ed) {int mid = bt + (ed - bt) / 2;mergeSort(A, bt, mid);mergeSort(A, mid + 1, ed);mergeArray(A, bt, mid, ed);}}private static void mergeArray(int A[], int bt, int mid, int ed) {int i, j, k, len = ed - bt + 1;int tmp[] = new int[len];for (i = bt, j = mid + 1, k = 0; i <= mid && j <= ed; k++) {if (A[i] <= A[j]) {tmp[k] = A[i++];} else {tmp[k] = A[j++];}}while (i <= mid) {tmp[k++] = A[i++];}while (j <= ed) {tmp[k++] = A[j++];}for (i = 0; i < k; i++) {A[bt + i] = tmp[i];}}
测试程序
import java.util.Scanner;public class JavaSort {public static void main(String args[]) {Scanner cin = new Scanner(System.in);int A[], n;while (cin.hasNext()) {n = cin.nextInt();A = new int[n];for (int i = 0; i < n; i++) {A[i] = cin.nextInt();}// bubbleSort(A, n);// insertSort(A, n);// selectSort(A, n);// heapSort(A, n);// quickSort(A, 0, n - 1);mergeSort(A, 0, n - 1);printArr(A);}}/** * 归并排序 * * @param A * @param bt * @param ed */public static void mergeSort(int A[], int bt, int ed) {if (bt < ed) {int mid = bt + (ed - bt) / 2;mergeSort(A, bt, mid);mergeSort(A, mid + 1, ed);mergeArray(A, bt, mid, ed);}}/** * 合并数组 * * @param A * @param bt * @param mid * @param ed */private static void mergeArray(int A[], int bt, int mid, int ed) {int i, j, k, len = ed - bt + 1;int tmp[] = new int[len];for (i = bt, j = mid + 1, k = 0; i <= mid && j <= ed; k++) {if (A[i] <= A[j]) {tmp[k] = A[i++];} else {tmp[k] = A[j++];}}while (i <= mid) {tmp[k++] = A[i++];}while (j <= ed) {tmp[k++] = A[j++];}for (i = 0; i < k; i++) {A[bt + i] = tmp[i];}}/** * 快速排序 * * @param A * @param bt * @param ed */public static void quickSort(int A[], int bt, int ed) {if (bt < ed) {int pivot = pivotPartition(A, bt, ed);quickSort(A, bt, pivot - 1);quickSort(A, pivot + 1, ed);}}private static void swapVar(int A[], int bt, int ed) {int mid = bt + (ed - bt) / 2;if (mid != bt) {A[bt] = A[bt] ^ A[mid];A[mid] = A[bt] ^ A[mid];A[bt] = A[bt] ^ A[mid];}}/** * 快排寻找基准点位置 * * @param A * @param bt * @param ed * @return */private static int pivotPartition(int A[], int bt, int ed) {// 取中间值作为stand,防止数组有序出现O(n^2)情况swapVar(A, bt, ed);int stand = A[bt];while (bt < ed) {while (bt < ed && A[ed] >= stand) {ed--;}if (bt < ed) {A[bt++] = A[ed];}while (bt < ed && A[bt] <= stand) {bt++;}if (bt < ed) {A[ed--] = A[bt];}}A[bt] = stand;return bt;}/** * 堆排序(从小到大) * * @param A * @param n */public static void heapSort(int A[], int n) {int tmp;// 构建大根堆buildMaxHeap(A, n);for (int j = n - 1; j >= 1; j--) {tmp = A[0];A[0] = A[j];A[j] = tmp;maxheapIfy(A, 0, j);}}/** * 构建大根堆 * * @param A * @param n */private static void buildMaxHeap(int A[], int n) {for (int i = (n - 2) / 2; i >= 0; i--) {maxheapIfy(A, i, n);}}/** * 维护从下标i开始的最大堆 * * @param A * @param i * @param n */private static void maxheapIfy(int A[], int i, int n) {int left, right, loc;while (i < n) {left = 2 * i + 1;right = 2 * i + 2;loc = i;if (left < n && A[left] > A[i]) {i = left;}if (right < n && A[right] > A[i]) {i = right;}if (loc != i) {A[i] = A[loc] ^ A[i];A[loc] = A[loc] ^ A[i];A[i] = A[loc] ^ A[i];} else {break;}}}/** * 直接选择排序 * * @param A * @param n */public static void selectSort(int A[], int n) {int i, j, loc;for (i = 0; i < n; i++) {loc = i;for (j = i + 1; j < n; j++) {if (A[j] < A[loc]) {loc = j;}}if (loc != i) {A[i] = A[i] ^ A[loc];A[loc] = A[i] ^ A[loc];A[i] = A[i] ^ A[loc];}}}/** * 直接插入排序 * * @param A * @param n */public static void insertSort(int A[], int n) {int i, j, tmp;for (i = 1; i < n; i++) {tmp = A[i];for (j = i - 1; j >= 0; j--) {if (A[j] > tmp) {A[j + 1] = A[j];} else {break;}}A[j + 1] = tmp;}}/** * 冒泡排序 * * @param A * @param n */public static void bubbleSort(int A[], int n) {int i, j;for (i = 0; i < n - 1; i++) {for (j = 0; j < n - i - 1; j++) {if (A[j] > A[j + 1]) {A[j] = A[j] ^ A[j + 1];A[j + 1] = A[j] ^ A[j + 1];A[j] = A[j] ^ A[j + 1];}}}}/** * 打印数组 * * @param A */public static void printArr(int A[]) {for (int i = 0; i < A.length; i++) {if (i == A.length - 1) {System.out.printf("%d\n", A[i]);} else {System.out.printf("%d ", A[i]);}}}}
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- java中各种常用排序实现(直接插入排序、直接选择排序、堆排序、冒泡排序、快速排序和归并排序)
- 冒泡排序 快速排序 选择排序 堆排序 直接插入排序 希尔排序 归并排序
- Java基础篇之----排序(快速排序、冒泡排序、堆排序、简单选择排序、 希尔排序、直接插入排序)
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)
- 直接插入排序 + 希尔排序+ 冒泡排序+ 快速排序 + 直接选择排序 + 堆排序
- 排序算法---基础算法(冒泡排序,快速排序,选择排序,直接插入排序,桶排序)
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- C++实现直接插入排序,折半插入排序,希尔排序,冒泡排序,简单选择排序,快速排序,堆排序
- 冒泡排序、选择排序、直接插入排序(java实现)
- 排序算法(堆排序,归并排序,快速排序、选择排序、直接插入排序)
- 直接插入排序,冒泡排序,快速排序,简单选择排序,堆排序,2-路归并排序,文件存储
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- java 排序算法小节 直接插入排序 冒泡排序 选择性排序 快速排序 归并排序
- UIActionSheet 按钮不响应点击事件的解决方法
- file_operations结构体详细分析
- HTML 学习笔记
- IOS 剪切板
- IOS 获取视频图片的
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- jQuery 学习笔记
- javacript radio checkbox
- Wordpress主页不能正常显示
- 函数参数传递规则(一)
- 修改cocos2d-x提供build_native.sh经验
- div+css基础教程
- 应用集合视图(UICollectionView)-创建UICollectionViewCell子类单元格
- java正则表达式详解