java--演算法--排序演算法
阿新 • • 發佈:2021-07-11
- 排序演算法的基本介紹:
-
演算法的具體實現:
-
-
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 * 排序演算法: * 氣泡排序
-
-
-
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; } } } }
-
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; } } }
-
-
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; } } } }
-
-
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); } }
-
-