package com.paixu.paixuTest;
import java.util.Arrays;
import java.util.Scanner;
/**
* 插入排序
* 1)直接插入排序
* 2)折半插入排序
* 3)希尔排序
* 写输入输出
*/
public class charupaixu {
public static void main(String[] args) {
System.out.println("请输入带排序数,以空格间隔:");
Scanner scanner = new Scanner(System.in);
int[] arr = new int[5];
while (scanner.hasNext()){
for (int i=0;i<arr.length;i++){
arr[i] = scanner.nextInt();
}
// 1、直接插入排序
insertFun1(arr);
// 2、折半插入排序
zheBanInsert(arr);
//3、希尔排序
xiErInsertFun(arr);
}
}
/** 这个得加深印象,多理解
* 增量,组内排序(直接插入排序)
* 希尔排序
* 其实交替着对每组进行组内比较的,交替!!这个很重要
* @param arr
*/
private static void xiErInsertFun(int[] arr) {
for (int dis = arr.length/2;dis>0;dis = dis/2){
for (int i=dis;i<arr.length;i++){
// 开始组内比较
int temp = arr[i];
int j = i-dis;
while (j>=0 && temp < arr[j]){ // 前面的比后面的大,则交换位置
arr[j+dis] = arr[j]; // 大的放到后面来
j = j - dis; // 这个条件很重要
}
arr[j+dis] = temp;
}
}
System.out.println("希尔排序:"+Arrays.toString(arr));
}
/** 输入5个元素
* 折半插入排序 升序
* 本质上和直接插入排序没什么不同,只是查找元素的方法变了。
* 先找到元素要插入的位置,然后摞动元素,然后赋值。
* @param arr
*/
private static void zheBanInsert(int[] arr) {
for (int i=1;i<arr.length;i++){
int temp = arr[i];
// 用折半查找法去查找
int low = 0;
int high = i-1;
while (low<=high){
int mid = (low+high)/2;
if (arr[mid]>temp){
high = mid - 1;
}else {
low = mid + 1;
}
}
// 确定最后的位置为low或者high+1
for (int j=i-1;j>=low;j--){
arr[j+1] = arr[j];
}
// 赋值
arr[low] = temp;
}
System.out.println("折半插入排序:"+Arrays.toString(arr));
}
/** 输入5个元素
* 直接插入排序 升序
* @param arr
*/
private static void insertFun1(int[] arr) {
int i=0,j=0,temp=0;
for (i=1;i<arr.length;i++){
temp = arr[i];
for (j=i-1;j>=0;j--){
if (arr[j]>temp){
arr[j+1] = arr[j];
}else {
break;
}
}
arr[j+1] = temp;
}
System.out.println("直接插入排序:"+Arrays.toString(arr));
}
}
插入排序-Java
最新推荐文章于 2021-03-22 03:57:50 发布