論壇數組排序方法總結

原題:

有一個整數數組,有很多 個元素,如何把零移到最前面,要求算法效率要高。如 0,1,72,3,0,5,9,0,6,51,0,3。移動後爲0,0,0,0,1,72,3,5,9,6,51,3。不知JE的牛人們有什麼高效的算 法。

補充: 非零元素的位置不能改變的。

地址: http://www.iteye.com/topic/684511

本人笨拙:

1、 自己寫的算法:利用數組copy,倒序插入。論壇上也有哥們提到過此算法。代碼如下

public class test8 {
    public static void main(String...strings){
        int[] arr1={0,1,72,3,0,5,9,0,6,51,0,3};
        int[] arr2=new int[arr1.length];
        int index1=arr1.length;
        int index2=arr1.length;
        while(index1>0){
            if(arr1[--index1]!=0){
                arr2[--index2]=arr1[index1];
            }
        }
        for(int i=0;i<arr1.length;i++){
            System.out.print(arr2[i]+",");
        }
    }
}

分析:個人感覺速度上可以,佔用空間。其中倒序思路與數組緊湊法類似。

2.

數組緊湊法:學習中。。
public class test9 {
     private static int[] array={0,1,72,3,0,5,9,0,6,51,0,3};
      public static int[] move(int [] array) 
       { 
            //自右向左掃描,將所有非零元素緊湊到右側 
            int low,high; 
           for(low = array.length-1,high=low ; low>=0;low--) 
               if(array[low]!=0) 
                { 
                    array[high] = array[low]; 
                    high -- ;//更新緊湊序列的最左側元素 
               } 
           //將餘下所有元素全部置爲0 
           for(;high>=0 ; high--) 
               array[high] = 0; 
           return array; 
       } 
      public static void main(String...strings){
          move(array);
          for(int i=0;i<array.length;i++){
              System.out.print(array[i]+",");
          }
         
      }
}

3:

public class test10 {
private static int[] array = { 0, 1, 72, 3, 0, 5, 9, 0, 6, 51, 0, 3 };

    static void frontzero(int array[]) {
        int zero = array.length - 1, nozero = zero;
        while (nozero >= 0) {

            if (array[zero] == 0 && array[nozero] != 0) {
                array[zero] = array[nozero];
                array[nozero] = 0;
                zero--;
            }
            if (array[zero] != 0)
                zero--;
            if (array[nozero] == 0)
                nozero--;

            if (zero < nozero)
                nozero = zero - 1;
        }
    }

    public static void main(String... strings) {
        frontzero(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + ",");
        }

    }
}
方法 4


public class test11 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] array = new int[] { 0, 1, 72, 73, 0, 5, 9, 0, 6, 51, 0, 0 };
        array = moveZero(array);
        for (int k = 0; k < array.length; k++) {
            System.out.print(array[k]+",");
        }
    }
    /**
     * 從右邊邊開始找零,如果找到0,就把前面的元素都往後面挪一個位置,並且第一個元素補零,沒有的話,就往左邊找,理論上需要循環 length-
     * zeroNum 次
     *
     * @param array
     * @return
     */
    public static int[] moveZero(int[] array) {
        // 統計零的個數
        int zeroNum = 0;
        for (int i = array.length - 1; i > 0;) {
            if (array[i] == 0) {
                zeroNum++;
                // 零前面的元素都往後面移動下
                for (int j = i; j > 0; j--) {
                    array[j] = array[j - 1];
                }
                // 移動完後,前面補零
                array[0] = 0;
                if (i < zeroNum) {
                    // 說明前面的都是0了,不用再找了
                    break;
                }
            } else {
                // 沒有爲零,移動下標,再往前找
                i--;
            }
        }
        return array;
    }

}

方法 5

public class test12 {
      public static void main(String[] args) 
          { 
              int[] array = new int[] { 0, 1, 72, 3, 0, 5, 9, 0, 6, 51, 0, 3, 0, -5, 9, 0, 8, -34, 0, -1 }; 
              int first = 0; 
              System.out.println(Arrays.toString(array)); 
              for (int i = 0; i < array.length; i++) 
              { 
                  if (array[i] == 0) 
                  { 
                      if (first < i) 
                      { 
                          for (int j = i - 1; j >= first; j--) 
                          { 
                              array[j + 1] = array[j]; 
                          } 
                          array[first] = 0; 
                          first++; 
                      } 
                  } 
              } 
              System.out.println(Arrays.toString(array)); 
          } 
}
下班了,就現不錯分析了,先mark下,等回頭再總結下。上面的代碼中感覺有冒泡和快速的思想在裏面

上面的算法有好有壞,不做分析。關鍵是學習大家思路。不同的場景應用不同的算法會更高效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章