package com.dudy.learn01.utils; import java.util.Arrays; /** * Created by dudy on 2017/3/6. * 练习数组的各种排序 * 参考:http://wiki.jikexueyuan.com/project/java-special-topic/sort.html * http://www.cnblogs.com/liuling/p/2013-7-24-01.html * * 内排序有可以分为以下几类:   (1)、插入排序:直接插入排序、二分法插入排序、希尔排序。   (2)、选择排序:简单选择排序、堆排序。   (3)、交换排序:冒泡排序、快速排序。   (4)、归并排序   (5)、基数排序 * */ public class ArraySortDemo { /** * 二分法查找 插入 * 和 直接插入排序不同的是: 查找 要插入的位置的方式不同 * 二分法前提是有序的** */ public static void dichotomySort(int src[]){ for (int i = 0; i< src.length ; i++){ int temp = src[i]; int right = i - 1; int mid = 0; int left = 0; while (left <= right){ mid = (left + right)/2; if (temp > src[mid]){ left = mid + 1; } else { right = mid - 1; } } for (int j = i-1;j>=left ; j--){ src[j+1] = src[j]; } System.out.println("left = " + left +" ,mid = " + mid + " ,right = " + right); src[left] = temp; } } /** * 直接插入排序 * 思想:假定前边是有序地部分, 后边无序的插入到前边部分 * 可以转变思想: 从后往前遍历, 将有序部分大于当前的值 往后移 * @param src */ public static void directInsertSort(int[] src){ for (int i = 1;i < src.length ; i++){ // 待插入的元素 int temp = src[i]; int j; for ( j = i -1; j >= 0; j--){ // 大于 temp的往后移动 if (src[j] > temp){ src[j+1] = src[j]; } else { break; } }// 此时遍历完 j+1 为要插入的位置 src[j+1] = temp; } } public static void main(String[] args) { int a[] = new int[]{46,89,14,44,90,32,25,67,23}; // 14,23,25,32,44,46,67,89,90 //Arrays.sort(a); //directInsertSort(a); dichotomySort(a); for (int i = 0; i< a.length ; i++){ System.out.print(a[i] + ","); } } }