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