常见内部排序算法之插入排序ITeye - 千亿集团

常见内部排序算法之插入排序ITeye

2019年02月27日11时22分47秒 | 作者: 浩皛 | 标签: 排序,算法,增量 | 浏览: 2223

常见内部排序算法之刺进排序
今日来写写刺进排序算法,光辉直接刺进,减半刺进,希尔排序(Shell)。
刺进刺进,就是将数组分红已排序,未排序,然后将未排序中的第一个刺进已排序中的合适方位,这样,未排序越来越少,直到没有就算排序完结!而默许开端则是第一个是已排序,剩余的则是未排序。
直接刺进算法:
package test.aglorith;
import java.util.Arrays;
public class InsertSort {
 public static void sort(int[] data) {
 int data_len=data.length;
 for (int i = 1; i data_len; i++) {//默许第一个(下标是0)是已排序,从未排序中的第二个(下标是1)开端
 int temp=data[i];
 int j = i-1;
 while (j =0 temp data[j]) {
 data[j+1]=data[j];
 j;
 data[j+1]=temp;
 System.out.println(Arrays.toString(data));
 public static void main(String[] args) {
 int[] data=new int[]{10,9,8,7,6,5,4,3,2,1};
 System.out.println("排序之前"+Arrays.toString(data));
 sort(data);

减半刺进算法:
package test.aglorith;
import java.util.Arrays;
public class InsertSortBinary {
 public static void sort(int[] data) {
 int data_len=data.length;
 for (int i = 1; i data_len; i++) {
 int temp=data[i];
 int mid=getMid(data, i);
 swapPass(data, i, mid);
 data[mid]=temp;
 System.out.println(Arrays.toString(data));
 public static int getMid(int[] data,int i) {
 int temp=data[i];
 int low=0;
 int hight=i-1;
 while (low =hight) {
 int mid=(low+hight)/2;
 if (temp data[mid]) {
 hight=mid-1;
 }else {
 low=mid+1;
 return low;//无论如何都是回来low,折中折中,无非最终只剩余两个的时分,挑选谁作为被替代者
 public static void swapPass(int[] data,int i,int mid) {
 for (int j = i; j mid; j) {
 data[j]=data[j-1];
 public static void main(String[] args) {
 int[] data=new int[]{11,10,9,8,7,6,5,4,3,2,1};
 System.out.println("排序之前"+Arrays.toString(data));
 sort(data);

希尔排序算法:又称缩小增量排序
因为刺进排序需求很多的移动数据,因而功率会受到影响。而在希尔排序开端时增量较大,分组较多,每组的记载数目少,故各组内直接刺进较快,后来增量increment逐步缩小,分组数逐步削减,而各组的记载数目逐步增多,但因为现已按increment*+3作为间隔排过序,使文件较接近于有序状况,所以新的一趟排序进程也较快。因而,希尔排序在功率上较直接刺进排序有较大的改善。
package test.aglorith;
import java.util.Arrays;
public class ShellSort {
 //经过增量increment分组进行排序
 public static void sortByIncrement(int[] data,int increment) {
 int data_len=data.length;
 for (int i = increment; i data_len; i++) {
 int temp=data[i];
 int j=i-increment;
 while (j =0 temp data[j]){
 data[j+increment]=data[j];
 j=j-increment;
 data[j+increment]=temp;
 System.out.println(Arrays.toString(data));
 //不同的increment分组排序,直到increment=1(相当于直接刺进排序,可是因为前面的排序现已使得数组基本上处于有序状况)
 public static void sort(int[] data) {
 int increment=data.length;
 while (increment 1) {
 increment=(increment-1)/3;
 sortByIncrement(data,increment);
 public static void main(String[] args) {
 int[] data=new int[]{13,12,11,10,9,8,7,6,5,4,3,2,1};
 System.out.println("排序之前"+Arrays.toString(data));
 sort(data);

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章