1. 程式人生 > 其它 >java--演算法--排序演算法

java--演算法--排序演算法

  1. 排序演算法的基本介紹:
  2. 演算法的具體實現:

      1. package com.model.sort;
        
        import java.time.LocalDateTime;
        import java.time.format.DateTimeFormatter;
        import java.util.Arrays;
        import java.util.UUID;
        
        /**
         * @Description:測試類
         * @Author: 張紫韓
         * @Crete 2021/7/11 9:11
         * 排序演算法:
         * 氣泡排序
         
        */ public class SortDemo01 { public static void main(String[] args) { int[] arr=new int[]{1,5,3,9,4,2,6,7}; int[] arr1=new int[]{1,2,3,4,5,6}; System.out.println(Arrays.toString((sort(arr1)))); int[] arr2=new int[80000]; for (int i = 0; i < 80000; i++) { arr2[i]
        = (int)(Math.random()*80000); } int second = LocalDateTime.now().getSecond(); sort(arr2); System.out.println("總共花費時間:"+(LocalDateTime.now().getSecond()-second)); } public static int[] sort(int[] arr){ // 氣泡排序的時間複雜度是o(n^2) boolean flag=false;
        for (int i=0;i< arr.length-1;i++){ for (int j = 0; j < arr.length-1-i ; j++) { if (arr[j]>arr[j+1]){ flag=true;//如果某一趟一次交換都沒有發生則說明已經排好了,可以直接退出了 int n=arr[j]; arr[j]=arr[j+1]; arr[j+1]=n; } } if (flag==false){ break; }else { flag=false; } } return arr; } }
      1. package com.model.sort;
        
        import java.time.LocalDateTime;
        import java.util.Arrays;
        
        /**
         * @Description:測試類
         * @Author: 張紫韓
         * @Crete 2021/7/11 10:34
         * 排序演算法:
         * 選擇排序 Select Sort
         */
        public class SortDemo02 {
            public static void main(String[] args) {
                int[] array=new int[]{9,3,1,6,4,2,7,8,5};
                selectSort(array);
                System.out.println(Arrays.toString(array));
        
                int[] array1=new int[80000];
                for (int i=0;i<80000;i++){
                 array1[i]=(int)(Math.random()*800000);
                }
                int second = LocalDateTime.now().getSecond();
                selectSort(array1);
                System.out.println(LocalDateTime.now().getSecond()-second);
        
            }
        //    選擇排序:記錄最小值和最小值的下標
            public static void selectSort(int[] array){
                for (int i=0;i<array.length-1;i++){//第一圈找到最小的放在第一個位置
                    int min=array[i];
                    int index=i;
                    for (int j = i; j < array.length; j++) {
                        if (array[j]<min){
                            min=array[j];
                            //找到最小的進行交換
                            index=j;
                        }
                    }
                    if (i != index) {
                        int n=array[i];
                        array[i]=array[index];
                        array[index]=n;
                    }
        
        
                }
        
            }
        }
      1. package com.model.sort;
        
        import java.util.Arrays;
        
        /**
         * @Description:測試類
         * @Author: 張紫韓
         * @Crete 2021/7/11 11:06
         * 選擇排序:
         * 插入排序 (Insertion Sort)
         * 分成兩個表,一個是有序的的,一個無序的表,尋找無序表中第一個元素在有序表中的位置,插入,一次類推,將無序表中的資料全部放在有序表中
         */
        public class SortDemo03 {
            public static void main(String[] args) {
                int[] array = new int[]{9,5, 6, 4, 2, 1, 3, 7,8};
        //        insertionSort(array);
        //        System.out.println(Arrays.toString(array));
        //        insertionSort02(array);
        //        System.out.println(Arrays.toString(array));
        
                insertionSort02(array);
                System.out.println(Arrays.toString(array));
            }
        
            public static void insertionSort(int[] array) {
        
                for (int i = 1; i < array.length; i++) {
                    int insertVal = array[i];
                    int index = i - 1;
                    while (index >= 0 && insertVal < array[index]) {
                        array[index + 1] = array[index];
                        index--;
                    }
                    array[index + 1] = insertVal;
                }
            }
        
            public static void insertionSort02(int[] array) {
        
                for (int i = 1; i < array.length; i++) {
                    int insertVal = array[i];
                    int index = i;
                    for (int j = 0; j <= i; j++) {
                        if (array[j] > insertVal) {
                            index = j;
                            break;
                        }
                    }
                    for (int k = i; k > index; k--) {
                        array[k] = array[k - 1];
                    }
                    array[index] = insertVal;
                }
            }
        
            public static void insertionSort03(int[] array) {
        
                for (int i = 1; i < array.length; i++) {
                    int insertVal = array[i];
                    int index = 0;
                    for (int j = i - 1; j >= 0; j--) {
                        if (insertVal > array[j]) {
                            index = j + 1;
                            break;
                        }
                        array[j + 1] = array[j];
                    }
                    array[index] = insertVal;
                }
            }
        }
      1. package com.model.sort;
        
        import java.time.LocalDateTime;
        import java.util.Arrays;
        
        /**
         * @Description:測試類
         * @Author: 張紫韓
         * @Crete 2021/7/11 17:13
         * 排序演算法:
         * 希爾排序 (Hill Sort)
         */
        public class SortDemo04 {
            static int count=0;
            public static void main(String[] args) {
        
                int[] array = new int[]{8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        //        hillSort(array);
        //        System.out.println(Arrays.toString(array));
        //        hillSort02(array);
        //        System.out.println(Arrays.toString(array));
        //        hillSort03(array);
        //        System.out.println(Arrays.toString(array));
        //        hillSort04(array);
        //        System.out.println(Arrays.toString(array));
        
                int[] arrays = new int[8000000];
                for (int i = 0; i < 8000000; i++) {
                    arrays[i]= (int) (Math.random()*800000);
                }
                int second = LocalDateTime.now().getSecond();
                hillSort04(arrays);
                System.out.println("花費時間為"+(LocalDateTime.now().getSecond()-second));
        
        
            }
        
            public static void hillSort(int[] array) {
                int groupNum = array.length / 2;
                while (groupNum >= 1) {
        
                    for (int i = 0; i < groupNum; i++) {
        
                        //對每組的資料進行插入排序
                        for (int j = 1; j < array.length / groupNum; j++) {
                            int insertVal = array[i + j * groupNum];
                            int index = i + (j - 1) * groupNum;
                            while (index >= 0 && insertVal < array[index]) {
                                array[index + groupNum] = array[index];
                                index = index - groupNum;
                            }
                            array[index + groupNum] = insertVal;
                        }
        
                    }
                    groupNum = groupNum / 2;
        
                }
            }
        
            //    交換的方式實現希爾排序
            public static void hillSort02(int[] array) {
        
                int groupNum = array.length / 2;
                while (groupNum >= 1) {
                    for (int i = groupNum; i < array.length; i++) {
                        for (int j = i - groupNum; j >= 0; j -= groupNum) {
                            if (array[j] > array[j + groupNum]) {
                                int temp = array[j + groupNum];
                                array[j + groupNum] = array[j];
                                array[j] = temp;
                            }
                        }
                    }
                    System.out.println("第"+count+++"躺"+Arrays.toString(array));
                    groupNum = groupNum / 2;
                }
            }
        
            public static void hillSort03(int[] array){
                int temp=0;
                for (int groupNum=array.length/2;groupNum>0;groupNum/=2){
                    for (int i=groupNum;i<array.length;i++){
                        for (int j=i-groupNum;j>=0;j-=groupNum){
                            if (array[j]>array[j+groupNum]){
                                temp=array[j];
                                array[j]=array[j+1];
                                array[j+1]=temp;
                            }
                        }
                    }
                    System.out.println("第"+(++count)+"輪比較的結果:"+Arrays.toString(array));
                }
            }
        //    移動的方式實現希爾排序(時間最快)
            public static void hillSort04(int[] array){
                for (int groupNum=array.length/2;groupNum>0;groupNum/=2){
                    for (int i=groupNum;i<array.length;i++){
                        int insertVal=array[i];
                        int index=i-groupNum;
                        while(index>=0&&insertVal<array[index]){
                            array[index+groupNum]=array[index];
                            index-=groupNum;
                        }
                        array[index+groupNum]=insertVal;
                    }
                }
            }
        }
      1. package com.model.sort;
        
        import java.util.Arrays;
        
        /**
         * @Description:測試類
         * @Author: 張紫韓
         * @Crete 2021/7/11 20:26
         * 排序演算法:
         * 快速排序(Quick sort)-->交換排序(氣泡排序)
         */
        public class SortDemo05 {
            public static void main(String[] args) {
                int[] array = {1, 2, 3, -1, -2, 0};
                quickSort(array, 0, array.length - 1);
                System.out.println(Arrays.toString(array));
        
            }
        
            public static void quickSort(int[] array, int left, int right) {
        
                int l = left;
                int r = right;
                int pivot = array[(l + r) / 2];
                //遞迴實現將比pivot大的值放在右邊,比pivot小的值放在左邊
                while (l < r) {
                    while (array[l] < pivot) {
                        l++;
                    }
                    while (array[r] > pivot) {
                        r--;
                    }
                    if (l >= r) {
                        break;
                    }
                    int temp = array[l];
                    array[l] = array[r];
                    array[r] = temp;
                    //交換之後發現,這個值和pivot相等,則跳過這個值
                    if (array[l]==pivot){
                        l++;
                    }
                    if (array[r]==pivot){
                        r--;
                    }
                }
                if (l==r){
                    l++;
                    r--;
                }
                if (left<r) quickSort(array, left, r);
                if (left>l) quickSort(array, l, r);
            }
        }
    1.