演算法面試題(二)

技術小能手發表於2018-09-14

初級

 1package test;
 2public class Test6 {
 3
 4    public static void main(String[] args) {            
 5        int[]arr=new int[]{15,2,21,6,4,25,77,43};
 6        int[] maoPao = maoPao(arr);
 7        for (int i : maoPao) {
 8            System.out.print(i+" ");
 9        }
10    }
11
12    /**
13     * 氣泡排序方法
14     * @param arr   要排序的陣列
15     * @return      排序之後的陣列
16     */
17    public static int[] maoPao(int[] arr){
18        //前一個元素
19        for (int i = 0; i < arr.length-1; i++) {
20            //後一個元素
21            for (int j = i+1; j < arr.length; j++) {
22                //如果後面的元素小於前邊的元素,互換位置
23                if(arr[j]<arr[i]){
24                    int temp=arr[i];
25                    arr[i] = arr[j];
26                    arr[j] = temp;
27                }           
28            }
29        }
30        return arr;
31    }
32}

優化級

1package test;
 2
 3    public class Test6 {
 4
 5        public static void main(String[] args) {
 6
 7            int[]arr=new int[]{15,2,21,6,4,25,77,43};
 8
 9            int[] maoPao2 = maoPao2(arr);
10            for (int i : maoPao2) {
11                System.out.print(i+" ");
12            }
13        }
14
15        /**
16         * 如果陣列已經排序好了,i只執行一次迴圈
17         * @param arr
18         * @return
19         */
20        public static int[] maoPao2(int[] arr){
21            if(arr==null)
22                return null;
23
24            boolean isSort;
25            Long start = System.currentTimeMillis();
26            for (int i = 0; i < arr.length; i++) {
27                isSort=true;
28                for (int j = 1; j < arr.length-i; j++) {
29                    if(arr[j-1]>arr[j]){
30                        int temp=arr[j-1];
31                        arr[j-1] = arr[j];
32                        arr[j] = temp;
33                        isSort=false;
34                    }
35                }
36
37                Long end = System.currentTimeMillis();
38                if(isSort)
39                System.out.println("用時:"+(end-start));
40                    break;
41            }
42            return arr;
43        }
44    }

高逼格的程式碼

介面:

 1import java.util.Comparator;
 2/**
 3 * 排序器介面(策略模式: 將演算法封裝到具有共同介面的獨立的類中使得它們可以相互替換)
 4 */
 5public interface Sorter {
 6   /**
 7    * 排序
 8    * @param list 待排序的陣列
 9    */
10   public <T extends Comparable<T>> void sort(T[] list);
11   /**
12    * 排序
13    * @param list 待排序的陣列
14    * @param comp 比較兩個物件的比較器
15    */
16   public <T> void sort(T[] list, Comparator<T> comp);
17}

實現類:

1import java.util.Comparator;
 2/**
 3 * 氣泡排序
 4 *
 5 */
 6public class BubbleSorter implements Sorter {
 7    @Override
 8    public <T extends Comparable<T>> void sort(T[] list) {
 9        boolean swapped = true;
10        for (int i = 1, len = list.length; i < len && swapped; ++i) {
11            swapped = false;
12            for (int j = 0; j < len - i; ++j) {
13                if (list[j].compareTo(list[j + 1]) > 0) {
14                    T temp = list[j];
15                    list[j] = list[j + 1];
16                    list[j + 1] = temp;
17                    swapped = true;
18                }
19            }
20        }
21    }
22    @Override
23    public <T> void sort(T[] list, Comparator<T> comp) {
24        boolean swapped = true;
25        for (int i = 1, len = list.length; i < len && swapped; ++i) {
26            swapped = false;
27            for (int j = 0; j < len - i; ++j) {
28                if (comp.compare(list[j], list[j + 1]) > 0) {
29                    T temp = list[j];
30                    list[j] = list[j + 1];
31                    list[j + 1] = temp;
32                    swapped = true;
33                }
34            }
35        }
36    }
37}

原文釋出時間為:2018-09-14

本文作者:IT技術之道

本文來自雲棲社群合作伙伴”IT技術之道,瞭解相關資訊可以關注“IT技術之道”。


相關文章