看代码即可 (/∩_∩/) :
转载请标注出处:
https://blog.csdn.net/CronousGT/article/details/80447641
package edu.hohai;
import java.util.ArrayList;
/**
* Created by Cronous on 2018/5/24.
* 该类主要用于对排序算法做一个整理,自己造轮子
* 包括以下6种排序算法
* 1.直接插入排序 directInsertSort(int[] inputArr)
* 2.希尔排序(插入排序的增量版)shellInsertSort(int[] inputArr)
* 3.冒泡排序 bubbleSort(int[] inputArr)
* 4.快速排序 quickSort(int[] inputArr,int left,int right)
* 5.选择排序(直接选择)straightSelectSort(int[] inputArr)
* 6.堆排序 stackSort(int[] inputArr)
*/
public class Sorted {
/**
* 直接插入排序
* @param inputArr 待插入排序的数组
*/
public static void directInsertSort(int[] inputArr){
int count = inputArr.length;
for(int i = 1;i < count;i++){
for(int j = i;j > 0 && inputArr[j] < inputArr[j - 1];j--){
int temp = inputArr[j];
inputArr[j] = inputArr[j - 1];
inputArr[j - 1] = temp;
}
}
}
/**
* 希尔插入排序(缩小增量排序)这里我选用的是 {n/2,[n/2]/2,....,1}增量来进行
* @param inputArr 待排序数组
*/
public static void shellInsertSort(int[] inputArr){
int count = inputArr.length;
int gap = count / 2;
while(gap >= 1){
int arrCount = gap;
for(int i = 0;i < arrCount;i++){
ArrayList elemList = new ArrayList();
ArrayList indexList = new ArrayList();
for(int j = 0;j < count;){
elemList.add(inputArr[j]);
indexList.add(j);
j = j + gap;
}
int[] tmp = new int[elemList.size()];
for(int s = 0;s < elemList.size();s++){
tmp[s] = (int) elemList.get(s);
}
directInsertSort(tmp);
for(int v = 0;v < indexList.size();v++){
int index = (int) indexList.get(v);
inputArr[index] = tmp[v];
}
}
gap = gap / 2;
}
}
/**
* 冒泡排序
* @param inputArr 待排序数组
*/
public static void bubbleSort(int[] inputArr){
for(int i = 0;i < inputArr.length;i++){
for(int j = 0;j < (inputArr.length - 1) - i;j++){
if(inputArr[j + 1] < inputArr[j]){
int temp = inputArr[j + 1];
inputArr[j + 1] = inputArr[j];
inputArr[j] = temp;
}
}
}
}
/**
* 快速排序
* @param inputArr 待排序数组
* @param left 数组开始下标
* @param right 数组结束下标
*/
public static void quickSort(int[] inputArr,int left,int right){
/**
*
* 1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
* 2.j–-由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
* 3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
* 4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
* 具体例子可以在网上查找一下
*/
if (left < right) {
int i = left, j = right, x = inputArr[left];
while (i < j) {
while(i < j && inputArr[j] >= x){
j--;
}
if(i < j){
inputArr[i++] = inputArr[j];
}
while(i < j && inputArr[i] < x){
i++;
}
if(i < j){
inputArr[j--] = inputArr[i];
}
}
inputArr[i] = x;
quickSort(inputArr, left, i - 1);
quickSort(inputArr, i + 1, right);
}
}
/**
* 直接选择排序
* @param inputArr 待排序数组
*/
public static void straightSelectSort(int[] inputArr){
/**
* 首先在所有记录中选出关键字值最小的记录,
* 把它与第一个记录进行位置交换,然后在其余的记录中再选出关键字值次小的记录与第二个记录进行位置交换,
* 依此类推,直到所有记录排好序。
*/
for(int i = 0;i < inputArr.length;i++){
int[] tempArr = new int[inputArr.length - i];
for(int j = i;j < inputArr.length;j++){
tempArr[j - i] = inputArr[j];
}
int[] ret = getMin(tempArr);
int index = ret[0];
int min = ret[1];
int temp = inputArr[i];
inputArr[i] = inputArr[index + i];
inputArr[index + i] = temp;
}
}
/**
* 堆排序
* @param inputArr 待排序数组
*/
public static void stackSort(int[] inputArr){
for(int i = inputArr.length / 2 - 1;i >= 0;i--){
adjustHeap(inputArr,i,inputArr.length);
}
for(int j = inputArr.length - 1;j > 0;j--){
swap(inputArr,0,j);
adjustHeap(inputArr,0,j);
}
}
/**
* 调整大顶堆(仅是调整过程,建立在大顶堆已构建的基础上)
* @param inputArr
* @param i
* @param length
*/
public static void adjustHeap(int[] inputArr,int i,int length){
int temp = inputArr[i];
for(int k = i * 2 + 1;k < length;k = k * 2 + 1){
if(k + 1 < length && inputArr[k] < inputArr[k + 1]){
k++;
}
if(inputArr[k] > temp){
inputArr[i] = inputArr[k];
i = k;
}else{
break;
}
}
inputArr[i] = temp;
}
/**
* 交换函数
* @param a 将需要交换的数封装为数组长度为 2的数组形式
*/
public static void swap(int[] a){
int temp = a[0];
a[0] = a[1];
a[1] = temp;
}
/**
* 交换元素
* @param arr
* @param a
* @param b
*/
public static void swap(int []arr,int a ,int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
/**
*求int数组当中最小值
* @param arr 待求数组
* @return 返回值 int[] 数组,第一项为最小值的下标,第二项为最小值
*/
public static int[] getMin(int[] arr){
int[] ret = new int[2];
int min = arr[0];
for(int i = 0;i < arr.length;i++){
if(arr[i] < min){
min = arr[i];
ret[0] = i;
}
ret[1] = min;
}
return ret;
}
public static void main(String[] args){
int[] input = new int[]{5,2,1,9,8};
stackSort(input);
for (int x: input) {
System.out.print(x+",");
}
}
}