1. 程式人生 > >java int數組任何數之間間隔不能對於指定數,內付極速排序

java int數組任何數之間間隔不能對於指定數,內付極速排序

證明 對比 lis rip clas 交換元素 ast left temp

public static void main(String[] args) {
        int []arr = {300,310, 210,313,334,360,255,233,275,274,410,510,559,609};
        //對數組進行排序;
        FastSort.sort(arr, 0, arr.length - 1);
        
        //輸出控制臺看看排序後的數據
        for (int i = 0; i < arr.length; i++) {
            System.out.print("====" + arr[i]);
        }
        
        
//用一個集合來裝匹配的數據 List<Integer> mylist = new ArrayList<Integer>(); //輸出一個空白換行 System.out.println(); //先把第一個最小的數據存起來 mylist.add(arr[0]); //記錄最後保存的數據的索引 int inIndex = 0; for (int i = 1; i < arr.length; i++) {
//判斷一下遍歷的數據和最後一個保存的數據的距離,大於或等於50就保存 if (arr[i] - arr[inIndex] >= 50) { mylist.add(arr[i]); inIndex = i; } } //遍歷保存的數據,看看對不對 for (int i = 0; i < mylist.size(); i++) { System.out.print("====" + mylist.get(i)); } }

極速排序

public class FastSort {
    /**  
     * @Description 這個方法是用來把數組分分成兩部分並根據參照點稍作位置調整數組元素位置的
     * @param arr 用來排序的數組
     * @param left 初始是數組的最左端索引,然後從第二次遞歸開始就由 point 決定,起到位置索引作用
     * @param right 初始是數組的最右端索引,然後從第二次遞歸開始就由 point 決定,起到位置索引作用
     * @param point 參照點,初始是初始是數組的最右端元素,然後從第二次遞歸開始就是 被劃分成兩部分的數組的兩個最右端元素
     * @return int 和參照點類似,返回的是參照點所在位置的前一個位置
     * @throws
     */
    private static int partition(int[] arr, int left, int right, int point) {
        int leftP = left -1;//leftP起指針作用,記錄準備要交換位置的元素的索引
        int rightP = right;//rightP起指針作用,記錄準備要交換位置的元素的索引
        while(true){
            while (leftP < rightP && arr[++leftP] < point);//用參照點從左往右一直對比,直到找到比參照點大的數就停下
            while (rightP > leftP && arr[--rightP] > point);//用參照點從右往左一直對比,直到找到比參照點小的數就停下
            if (leftP >= rightP) {//如果條件符合,證明左右兩頭往中間已經相遇並對比完所有元素
                break;
            }else{
                int temp = arr[leftP];//用剛才左右兩頭停下所記錄的位置交換元素,這裏的交換只是把小的元素移到左邊,大的移到右邊
                arr[leftP] = arr[rightP];
                arr[rightP] = temp;
            }
        }
        int temp = arr[leftP];//當上面的while循環都停止後,leftP 所在位置的元素就是大於或等於 參照點 的元素,所以把最大的放後面
        arr[leftP] = arr[right];
        arr[right] = temp;
        return leftP;//返回左邊開始的索引位置,用於下一輪切分數組
    }


    /**  
     * @Description 排序的方法,要用到遞歸
     * @param arr 用於排序的數組
     * @param left 這裏的左並不一定是數組的最左索引位置,也有可能是數組切分後的左邊
     * @param right 和 left 同理
     * @throws
     */
    public static void sort(int[] arr, int left, int right){
        if (left >= right) {//排序結束
            return;
        }else{
            int point = arr[right];//參照點是數組切分後的最右邊元素
            int partition = partition(arr, left, right, point);//把數組切分,並把大於參照點的值放在右邊,小於的放左,
            sort(arr, left, partition -1);//把切分後的數組繼續且
            sort(arr, partition +1 , right);//切到最後就是排序結束,此時發現已經排好序了
        }
    }

    public static void main(String[] args) {
        int[] arr = {19,4,6,65,15,2,0,12,13,20,25};
        sort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

}

java int數組任何數之間間隔不能對於指定數,內付極速排序