常用數組排序方法


所謂數組,就是相同數據類型的元素按一定順序排列的集合,就是把有限個類型相同的變量用一個名字命名,
然后用編號區分他們的變量的集合,這個名字稱為數組名,編號稱為下標。組成數組的各個變量稱為數組的分量,
也稱為數組的元素,有時也稱為下標變量。數組是在程序設計中,為了處理方便,
把具有相同類型的若干變量按有序的形式組織起來的一種形式。
這些按序排列的同類數據元素的集合稱為數組。
下面查了幾本書籍總結的幾個常用的數組排序,打打醬油。也希望對大家有幫助


數組線性查找
:又稱順序查找。在一列給定的數值進行搜索,
從一端開始逐步檢查每個元素,直到找到所需元素的過程
代碼如下
public class Test1 {
    public static void main(String[] args) {
        int[] array={1,2,3,6,4,5};
        System.out.println("請輸入你要查詢的數");
        Scanner ss= new Scanner(System.in);
        int input= ss.nextInt();
        int index=-1;//因為數組下標是從0開始的,如果下標還是-1說明
        //數組沒有找到你輸入的值
        for (int i = 0; i <array.length; i++) {

            if (array[i]==input){//判斷數組中有輸入的數據
                index=i+1;//i表示數組下標 +1說明是數組的位置
                break;
            }
        }
        if (index!=-1){
            System.out.println("在數組中找到了你輸入的值,在第"+index+"的位置");
        }else {
            System.out.println("數組中沒有你要找到值");
        }
    }
}
二分法查找:又稱折半查找法。將數組中間位置記錄的關鍵字與查找關鍵字比較
如果兩者相等 則查找成功;否則利用中間位置記錄將數組分成前后2個子數組,
如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一個子數組,
否則進一步查找后一個子數組。重復以上過程,直到找到或找不到
代碼如下:
public class Test2 {
    public static void main(String[] args) {
        int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 33, 55, 88 };
        int first = 0;//起始數
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入一個數");
        int num = scanner.nextInt();
        int last = array.length - 1;//最后一個數
        int index = -1;
        int middle ;//中間數
        while (last >= first) {
            middle = (first + last) / 2;
            if (array[middle] == num) {
                index = middle;//如果正好猜到中間數
                break;
            }
            if (num > array[middle]) {
                first = middle + 1;//猜的數大於中間數
                //把平分數第一個數賦值之前中間數,再次求平均數
            }
            if (num < array[middle]) {
                last = middle - 1;
            }
        }
        if (index != -1) {
            System.out.println("您要查的數在" + (index + 1) + "位");
        }else{
            System.out.println("抱歉沒有找到");
        }
    }
}

 

冒泡排序:比較相鄰的元素 如果第一個比第二個大 就交換它們倆位置下標
對每一個相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。
針對除了最后一個元素以外所有的元素重復以上的步驟。直到沒有任何一對數組需要比較。
代碼如下:
public class Test4 {
    public static void main(String[] args) {
        int [] array={1,2,3,9,7,6,4,5};
        //N個數比較的輪數為N-1
        for (int i = 0; i < array.length - 1; i++) {
            //每一輪比較的次數為N-1-i;
            for (int j = 0; j < array.length - 1 - i; j++) {
                //比較相鄰的兩個數 , 小的靠前
                if (array[j]>array[j+1]){
                    //兩個數做交換位置 通過設置臨時變量
                    int temp= array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                }
            }
        }
        //把排好順序的數組輸出一下
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }


}

 

選擇排序法:首先在未排序序列中找到最小元素,
存放到排序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小元素,然后放到排序序列的末尾。
以此類推 ,直到所有元素均排序完畢
代碼如下:

public class Test5 {
    public static void main(String[] args) {
        int[] array={1,3,5,2,6,7,4,9};
        int min=0;//保存最小元素值下標
        for (int i = 0; i < array.length - 1; i++) {
            min=i;//查找最小元素在數組的下標
            for (int j = i+1; j < array.length; j++) {
                if (array[min]>array[j]){
                    min=j;//保存最小數下標
                }
            }
            //如果第i個最小數的位置不在i上則進行交換
            if (i!=min){
                int temp=array[i];
                array[i]=array[min];
                array[min]=temp;
            }
        }
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

}
插入排序:
* 它是通過構建有序序列,對於未排序數據,在已排序序列中從后向前掃描,
* 找到相應位置並插入。從后向前掃描過程中,需要反復把排序元素逐步向后挪移,
* 為最新元素提供插入空間
代碼如下:
public class Test6 {
public static void main(String[] args) {
int[] array= {4,3,6,8,1,7};
for (int i = 0; i < array.length; i++) {

int temp=array[i];
//把下標保存下來
int j=i;
while (j>0&&temp<array[j-1]){
//上面的數覆蓋其下面的數
array[j]=array[j-1];
j--;
}
array[j]=temp;//插入數據
}
for (int i = 0; i <array.length; i++) {
System.out.println(array[i]);
}
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM