经典排序——插入排序

插入排序:是利用第1次排序到第p次排序,位置0p-1上的位置都是排序好的。

这样只要比较一下[i-1][i]就知道还要不要进入第2个循环。

如果[i-1]>[i]那么就要继续进入第二个循环。

将这个位置的[i]存起来temp;在令j=i;开始循环交换位置,temp[j]=temp[j-1]

这个时候进行下一步判断,temp[j-1]>temp,如果true继续交换,如果false,让test[j]=temp;即可

数组34,8,64,51,32,21

先比较34,8看要不要进入第二个循环,34>8,进入

交换34,8的位置  8,34 因为j--的原因j=0,退出循环,

i++,比较34,64   34<64不用进入

i++,比较64,51 64>51进入第二次循环。交换位置,8,34,64,64,虽然j-->0,但是temp[j-1]<temp一样退出循环,进行test[j]=temp,8,34,51,64

i++,比较64,32 64>32进入第二个循环,交换位置是这样的8.3451,64,64

要明白这个8,34,51,64,64。是利用这个才实现将元素的插入的。找到一个元素,也想这个元素在前边排序的中间,正是因为这个才能准确

的这个元素插入到准确的位置。

并且也不能将test[j-1]>test做成if的判断条件,因为即使没有产生交换也会造成j--从而不能排序不说,整个数组的数据都发生了变化。

代码如下:

public static void fastSortT(int [] test){
   for(int i=1;i<test.length;i++){
    if(test[i-1]>test[i]){//因为每次排序都会将前边的i-1个数排序,所以只要比较一个前边排序的最后一个就可以了,如果最大的也要小的话
     //那就不要排序了,直接就是这样了,只有最后一个比他要大才会细分。
     int temp = test[i];//将test[i]这个数保存起来。
     int j;
     for(j=i;j>0&&test[j-1]>temp;j--){
      test[j]=test[j-1];
     }
                    test[j] = temp;
    }
   }
  }

入门易,精通难
原文地址:https://www.cnblogs.com/chenshun-2016/p/5975368.html