java数据结构--插入排序

来源:互联网 发布:web即时通讯源码 编辑:程序博客网 时间:2024/05/18 05:57

直接插入排序:算法的基本思想是把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次即可完成排序过程。

 

public class Test {
 public static void main(String[] args) {
  int[] a = { 2, 54, 12, 5, 98};
  for (int i = 0; i< a.length; i++) {
   System.out.print(a[i]+ " ");
  }
  System.out.println();
  Test.insertSort(a);
  for (int i = 0; i< a.length; i++) {
   System.out.print(a[i]+ " ");
  }
 }

 public static voidinsertSort(int[] a) {
  for (int i = 1; i< a.length; i++) {
   int j =i;
   int t =0;
   while (j> 0 && a[j]< a[j - 1]) {
    t= a[j];
    a[j]= a[j - 1];
    a[j- 1] = t;
    j--;
   }
  }
 }
}

 

折半插入排序:折半插入排序也是一样需要将新元素插入到已排好序的数组中,只是这时不是对元素进行逐个比较,而是在插入之前先找到正确的位置,然后直接插入到那个位置当中。
所谓折半查找,也就是将一个数组分成一半来查找,准确地来说,是将数组分成两个一半来查找,

public class Test {
 public static void main(String[] args) {
  int[] a = { 2, 54, 12, 5, 98};
  for (int i = 0; i< a.length; i++) {
   System.out.print(a[i]+ " ");
  }
  System.out.println();
  Test.bInsertSort(a);
  for (int i = 0; i< a.length; i++) {
   System.out.print(a[i]+ " ");
  }
 }

 public static void bInsertSort(int[] a){
  for (int i = 1; i< a.length; i++) {
   int t =a[i];
   int low =0;
   int high = i- 1;
   while (low<= high) {
    intmiddle = (low + high) / 2;
    if(t < a[middle])
     high= middle - 1;
    else
     low= middle + 1;
   }
   for (int j =i; j > low; j--){
    a[j]= a[j - 1];
   }
   a[low] =t;
  }
 }

}

希尔排序:希尔排序算法的基本思想是先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。

 

public class Test {
 public static void main(String[] args) {
  int[] a = { 2, 54, 12, 5, 98};
  for (int i = 0; i< a.length; i++) {
   System.out.print(a[i]+ " ");
  }
  System.out.println();
  Test.shellSort(a);
  for (int i = 0; i< a.length; i++) {
   System.out.print(a[i]+ " ");
  }
 }

 publicstatic void shellSort(int[] a) {
  int d=a.length;
  while(d>1){
   d=(d+1)/2;
   for(inti=0;i<a.length-d;i++){
    if(a[i+d]<a[i]){
     intt=a[i+d];
     a[i+d]=a[i];
     a[i]=t;
    }
   }
  }
 }
}

 


原创粉丝点击