1. 程式人生 > 實用技巧 >堆排-元素去重-查詢問題

堆排-元素去重-查詢問題

堆排序與元素去重及查詢問題

1、堆排序與元素去重

package com.m.sort;


import java.util.Arrays;
import java.util.Random;

public class Test2 {
    public static void main(String[] args) {
        Random random = new Random();
        int[] arr = new int[12];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = random.nextInt(10) + 10;
        }
        System.out.println("原陣列:\n" + Arrays.toString(arr));

        sort(arr);

        System.out.println("堆排序後的陣列:\n" + Arrays.toString(arr));

        int n = repeatElementInArray(arr);
        int[] newArr = new int[n];
        System.arraycopy(arr, 0, newArr, 0, n);
        /*
        public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
                             引數
                            src - 源陣列。
                            srcPos - 源陣列中的起始位置。
                            dest - 目標陣列。
                            destPos - 目的地資料中的起始位置。
                            length - 要複製的陣列元素的數量。
                            
               public class ArrayStoreException 
               extends RuntimeException
               丟擲以表示嘗試將錯誤型別的物件儲存到物件陣列中。 
               例如,以下程式碼生成一個ArrayStoreException : 
               Object x[] = new String[3];
               x[0] = new Integer(0);
         */
        System.out.println("去重後的陣列:\n" + Arrays.toString(newArr));
    }

    /**
     * 陣列去重
     *
     * @param arr
     * @return
     */
    public static int repeatElementInArray(int[] arr) {
        int n = arr.length;
        int index = 0;
        if (n < 0) {
            return index;
        }
        index = 1;
        for (int i = 1; i < n; i++) {
            if (arr[i] == arr[i - 1]) {

            } else {
                arr[index] = arr[i];
                index++;
            }
        }
        return index;
    }

    /**
     * 堆排序
     *
     * @param arr
     */
    public static void sort(int[] arr) {
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjust(arr, i, arr.length);
        }
        for (int i = arr.length - 1; i > 0; i--) {
            swap(arr, 0, i);
            adjust(arr, 0, i);
        }
    }

    /**
     * 堆排序調整
     *
     * @param arr
     * @param i
     * @param length
     */
    public static void adjust(int[] arr, int i, int length) {
        int temp = arr[i];
        boolean flag = true;
        for (int j = i * 2 + 1; flag && j < length; j = j * 2 + 1) {
            if (j + 1 < length && arr[j] < arr[j + 1]) {
                j++;
            }
            if (arr[j] > temp) {
                arr[i] = arr[j];
                i = j;
            } else {
                flag = false;
            }
        }
        arr[i] = temp;
    }

    /**
     * 交換陣列的a與b的值
     *
     * @param arr
     * @param a
     * @param b
     */
    public static void swap(int[] arr, int a, int b) {
        int t = arr[a];
        arr[a] = arr[b];
        arr[b] = t;
    }
}
ICU(綜合性重症監護病房)CCU(冠心病重症監護室)兩者的區別在於:一個是各類重症都可進入,一個是隻冠心病重症。

ICU是英文Intensive Care Unit的縮寫,意為重症加強護理病房。重症醫學監護是隨著醫療護理專業的發展、新型醫療裝置的誕生和醫院管理體制的改進而出現的一種集現代化醫療護理技術為一體的醫療組織管理形式。中小醫院是一個病房,大醫院是一個特別科室,把危重病人集中起來,在人力、物力和技術上給予最佳保障,以期得到良好的救治效果。

2、查詢問題

package com.m.sort;


import java.util.Scanner;

//查詢問題
public class Test2 {
    //    順序查詢法
    //    ⼆分查詢法,前提是所查詢的陣列必須是有序的
    public static void main(String[] args) {
        test1();
    }

    //  順序查詢法
    public static void test() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入一個數:");
        int n = scanner.nextInt();
        System.out.println((isExist(n) ? "存在" : "不存在"));
    }

    public static boolean isExist(int num) {
        boolean flag = false;
        int[] arr = {5, 4, 3, 2, 8};
        for (int i = 0; i < arr.length; i++) {
            if (num == arr[i]) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    //  ⼆分查詢法
    public static void test1() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入一個數:");
        int n = scanner.nextInt();
        System.out.println((isExistByHalf(n) ? "存在" : "不存在"));
    }

    public static boolean isExistByHalf(int num) {
        boolean flag = false;
        int[] arr = {12, 5, 4, 3, 2, 1, -5};
        int low = 0;
        int high = arr.length - 1;
        while (low <= high) {
            int mid = (low + high) >>> 1;
            if (num < arr[mid]) {
                low = mid + 1;
            } else if (num > arr[mid]) {
                high = mid - 1;
            } else {
                flag = true;
                break;
            }
        }
        return flag;
    }
}