1. 程式人生 > >資料結構---排序

資料結構---排序

1、有序陣列二分查詢

首先設定判斷要找的資料為key,判斷其是否在 陣列的中間即a.length/2的位置,即key=a[a.length/2] 如果在直接返回。如果不在則迴圈獲取,重要的一點,中間元素的值為mid = start + (start + end)/2。 判斷如果key在mid位置則 返回,如果key>a[mid] 則start=mid +1;反之則為end = mid -1; 核心程式碼如下:

//如果在有序陣列的中間直接返回
        int mid=a.length/2;
        if (key==a[mid]) {
            return mid;
        }
        int
start=0; int end=a.length-1; while (start <= end) { //每次定位中間位置 mid = start+(end-start)/2; if(key == a[mid]){ return mid; }else if(key > a[mid]){ start = mid +1; }else{ end = mid-1
; } } return -1;
//遞迴查詢

private static int binSearch(int[] a, int start,int end,int key){
        int mid = (end - start)/2 +start;
        if(a[mid] == key){
            return mid;
        }else if(start >= end){
            return -1;
        }else if(a[mid] > key ){
            return
binSearch(a, start,mid -1,key); }else{ return binSearch(a,mid + 1, end,key); } }

2、氣泡排序 氣泡排序是簡單排序裡面效率最小的一種排序方式,假如有n個數據,外層迴圈n-1次。每次相比較n-i次,重點在於:如果a[j]>a[j+1],則快取temp=a[j+1],交換a[j]和a[j+1],核心程式碼如下:

//外層迴圈控制排序趟數(n-1)趟
        for (int i = 0; i < a.length -1 ; i++) {
            for (int j = 0; j < a.length -1 -i; j++) {    //每一趟排序多少次n - i趟
                if(a[j]>a[j+1]){
                    long temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
            }
        }

3、選擇排序 選擇排序 效率比氣泡排序的效率高一些,主要思想是當前的資料記錄為最小值min和接下來的資料做對比,如果接下來的資料比當前的小,則記錄此資料為最小值,接著向下比較,每一次迴圈找到一個數據最小的值,交換。核心程式碼如下

//外層迴圈控制排序趟數(n-1)趟
        int in,out,min;
        for (out = 0; out < mElement ; out++) {
            min = out;
            for (in = out+1; in < mElement; in++) {    //從下一個資料開始
                if(a[in]<a[min]){
                    min = in;
                }
            }
            long temp = a[out];
            a[out] = a[min];
            a[min] = temp;
        }

4、插入排序 定義一個臨時儲存的變數,將資料列表中第二個資料放入零時變數中,然後依次和它之前的資料比較,前一條資料如果大於等於temp的話移動,否則不移動。 定義一個臨時變數為temp, 核心程式碼如下:

//插入排序 --將第二個資料放入零時變數中,往取出資料的當前位置往前移動, 比較大小,放入相應的位置
        int out,in;
        for (out = 1; out <mElement; out++) {
            long temp = a[out];
            in = out;   
            while( in >0 && a[in-1]>=temp){  //往前迴圈, 判斷為:in不能越界, 前一條資料如果大於等於temp的話移動。 否則不移動
                a[in] = a[in-1];
                in--;
            }  //至此就移動結束
            a[in]=temp;
        }