//選擇排序,分爲簡單選擇排序、樹形選擇排序(錦標賽排序)、堆排序 此算法爲簡單選擇排序 public static void selectSort(int[] a){ for(int i=0;i<a.length;i++){ int minIndex = i; for (int j = i + 1; j < a.length; j++) { if (a[j] < a[minIndex]) { minIndex = j; } } if (minIndex != i) { int temp = a[minIndex]; a[minIndex] = a[i]; a[i] = temp; } } }
package com.test; public class Sort {
//打印數組
public static void displayData(int[] data){
for(int d:data){ System.out.println(d+""); } System.out.println(); }
//冒泡排序算法,時間複雜度O(n2),算法具備穩定性,堆排序和快速排序算法不具備穩定性,即排序後相同元素的順序會發生變化
public static void bubbleSort(int[] src){ if(src.length>0){ int length=src.length; for(int i=1;i<length;i++){ for(int j=0;j<length-i;j++){ if(src[j]>src[j+1]){ int temp=src[j]; src[j]=src[j+1]; src[j+1]=temp; } } } } }
//快速排序,時間複雜度O(nlogn),最壞時間複雜度O(n2),平均時間複雜度O(nlogn),算法不具穩定性
public static void quickSort(int[] src,int begin,int end){ if(begin<end){ int key=src[begin]; int i=begin; int j=end; while(i<j){ while(i<j && src[j]>key){ j--; }if(i<j){ src[i]=src[j]; i++; }while(i<j && src[i]<key){ i++; }if(i<j){ src[j]=src[i]; j--; } } src[i]=src[key]; quickSort(src, begin, i-1); quickSort(src, i+1, end); } } }
package com.test; import java.util.Arrays; public class Test { public static void compare(int []a) { for(int i=0;i<a.length-1;i++)
//外層循環控制比較輪數,從a[0]到a[a.length-2],最後一個數不用比較 { for(int j=i+1;j<a.length;j++)
//內層循環是要比較的數,老是在a[i]的後面,因此從i+1的位置開始,一直到最後一個數 { if(a[i]>a[j])
//若是大於進行交換 { int t=a[i]; a[i]=a[j]; a[j]=t; } } } } public static void main(String[] args) { int[] a={3,6,2,1,88,44,99,4,32}; compare(a); System.out.println(Arrays.toString(a)); } }
package com.test; import java.util.Arrays; public class MergeSort { //歸併排序,將兩個(或兩個以上)有序表合併成一個新的有序表 即把待排序序列分爲若干個子序列,每一個子序列是有序的。而後再把有序子序列合併爲總體有序序列 public static int[] sort(int[]nums,int low,int high){ int mid=(low+high)/2; if(low<high){ sort(nums,low,mid);//左邊 sort(nums,mid+1,high);//右邊 merge(nums,low,mid,high);//左右合併 } return nums; } public static void merge(int[] nums,int low,int mid,int high){ int[] temp=new int[high-low+1]; int i=low;//左指針 int j=mid+1;//右指針 int k=0; // 把較小的數先移到新數組中 while(i<=mid && j<=high){ if(nums[i]<nums[j]){ temp[k++]=nums[i++]; }else{ temp[k++]=nums[j++]; } } // 把左邊剩餘的數移入數組 while(i<=mid){ temp[k++]=nums[i++]; } // 把右邊剩餘的數移入數組 while(j<=high){ temp[k++]=nums[j++]; } // 把新數組中的數覆蓋nums數組 for(int k2=0;k2<temp.length;k2++){ nums[k2+low]=temp[k2]; } } public static void main(String[] args) { int[] nums={45,98,9,3,6}; MergeSort.sort(nums, 0, nums.length-1); System.out.println(Arrays.toString(nums)); } }