首页 > 代码库 > 经典排序——插入排序
经典排序——插入排序
插入排序:是利用第1次排序到第p次排序,位置0到p-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.34,51,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;
}
}
}
经典排序——插入排序