直接插入排序: 指每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 1.首先在当前有序区array[1..i-1]中查找array[i]的正确插入位置j(1≤j≤i-1);
for(j = i-1; j >= 0 && array[j] > temp; j --) { arr[j+1] = arr[j]; }temp为储存的array[i];将array中 j 后的记录均后移一个位置,腾出j位置上的空间插入array[i]。
public class button { public void charu(int [] array) { int x=0;//计数器,第x趟 for(int i=1;i<array.length;i++) { x++; int temp=array[i]; int j =0; //比目标数大的向后移 for(j= i; j >= 1 && array[j-1] > temp; j --) { array[j] = array[j-1]; } //找到目标位置,放入 array[j]=temp; System.out.print("\n第"+x+"趟:"); for(int a:array) { System.out.print(a+" "); } } } public static void main(String []args) { int [] array={8,3,2,5,9,3,6}; System.out.print("初始:"+" "); for(int a:array) { System.out.print(a+" "); } button button=new button(); button.charu(array); System.out.print("\n最终:"+" "); for(int a:array) { System.out.print(a+" "); } } }
如果是一个有序递增的序列,只需要比较,不需要移动 O(n) 如果为递减序列,每次比较后,还必须依次移动 O(n^2) 若有两个相同的数,排序前后,相对位置不变 所以稳定;
希尔排序: 把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序,小组的个数逐次缩小,当完成了所有数据元素都在一个组内的排序后,排序过程结束。 1,a[0]-a[n-1];待排序数组 2 ,b[0]-b[num-1];排序增量数组; 过程:
public class S{ public void shell(int[] a,int n,int [] b,int num) { int tmpe=0;//增量 int abc=0; int y=0; //循环增量数组,每次排序改变增量 for(int i=0;i<num;i++) { tmpe=b[i]; //小组个数 for(int j=0; j<tmpe; j++) { //在每个小组内直接插入排序,增量为tmpe for(int x=j; x<n-tmpe; x+=tmpe) { abc=a[x+tmpe]; y=x; while(y>-1&&abc<=a[y]) { a[y+tmpe]=a[y]; y=y-tmpe; } a[y+tmpe]=abc; } } System.out.println("第"+(i+1)+"趟:"+"增量为"+tmpe+" "); for(int m=0;m<n;m++) { System.out.print(a[m]+" "); } System.out.println(); } } public static void main(String [] args) { int [] arr={9,1,2,5,7,4,8,6,3,5}; int len=arr.length; System.out.print("初始:"); for(int i=0;i<len;i++) { System.out.print(arr[i]+" "); } System.out.println(); int [] brr={5,2,1}; int size=brr.length; new S(). shell(arr,len,brr,size); System.out.print("排序后:"); for(int i=0;i<len;i++) { System.out.print(arr[i]+" "); } } }平均时间: O(n^1.3) 不稳定