算法题2 插序算法
首先分析插序算法的原理:
舉例:int [] ints = {0,1,3,4,9,3,2,3,5,1,0};
for循環(huán)進(jìn)行遍歷,判斷相鄰兩個(gè)值得大小,如果前面的小于后面的,就開始進(jìn)行階循環(huán)。
即9,3時(shí),也就是i循環(huán)
階循環(huán)時(shí),從0,1,。。。4,9,進(jìn)行循環(huán),判斷其中j位上的值比i位上的值大的那一位。
for (int i = 1; i <= ints.length-1; i++) {if(ints[i]<ints[i-1]) {//此時(shí)進(jìn)入階循環(huán) jif(ints[j]>ints[i]) {}}這時(shí)需要找到介于階循環(huán)中的j ,j 位的值比i位的值大。
需要交換的是j位于i位;j與i位之間的需要后移。先后移即i-1 移到i,直到j(luò)+1 移到j(luò)+2;最后交換j與i位。
最后寫成方法:
static int[] insertion(int[] ints) {for (int i = 1; i <= ints.length-1; i++) {if(ints[i]<ints[i-1]) {//當(dāng)i位的值小于i-1位的值時(shí),開始進(jìn)行階循環(huán)for (int j = 0; j <=i-1; j++) {//當(dāng)j位的值大于i位的值時(shí)if(ints[j]>ints[i]) {int temp=ints[i];for (int k = i; k >=j; k--) {ints[k]=ints[k-1];}ints[j]=temp;}}}}return ints;}還沒有結(jié)束,檢查方法中冗余的計(jì)算,發(fā)現(xiàn)可以中斷一些后面沒用的循環(huán),不是i,也不是k,而是j.
static int[] insertion(int[] ints) {for (int i = 1; i <= ints.length-1; i++) {if(ints[i]<ints[i-1]) {//當(dāng)i位的值小于i-1位的值時(shí),開始進(jìn)行階循環(huán)for (int j = 0; j <=i-1; j++) {//當(dāng)j位的值大于i位的值時(shí)if(ints[j]>ints[i]) {int temp=ints[i];for (int k = i; k >=j; k--) {ints[k]=ints[k-1];}ints[j]=temp;break;}}}}return ints;}最后進(jìn)一步優(yōu)化,減少一步循環(huán)
static int[] insertion2(int[] ints) {for (int i = 1; i <= ints.length-1; i++) {for (int j = i; j >0; j--) {if(ints[j]<ints[j-1]) {int temp=ints[j-1];ints[j-1]=ints[j];ints[j]=temp;}}}return ints;}總結(jié)
- 上一篇: 黑客必须了解的网络知识
- 下一篇: 个人下一步学习计划