快速排序的原理:選擇一個關鍵值做爲基準值。比基準值小的都在左邊序列(通常是無序的),比基準值大的都在右邊(通常是無序的)。java
從後往前比較,用基準值和最後一個值比較,若是比基準值小的交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值小的值才交換。找到這個值以後,又從前日後開始比較,若是有比基準值大的,交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值大的值才交換。直到從前日後的比較索引>從後往前比較的索引,結束第一次循環,此時,對於基準值來講,左右兩邊就是有序的了。算法
接着分別比較左右兩邊的序列,重複上述的循環。數組
直接上代碼:ide
package Sort;blog
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;排序
import sun.nio.cs.FastCharsetProvider;遞歸
//基本數據類型四種排序算法總結索引
public class SortAll {io
public static void main(String [] args){
int []arr={8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6};
long len=System.currentTimeMillis();
fastIndex(arr);//12毫秒
//maoPaoSort(arr);//冒泡排序用時平均4.25毫秒
//selectSort(arr);//選擇排序用時平均2.5毫秒
//insertSort(arr);//插入排序用時平均1.6毫秒
//Arrays.sort(arr);//用時不到1毫秒 更快,對於數組長度大於286 且不規則數組,採用雙軸快速排序算法
long end=System.currentTimeMillis();
System.out.println(end-len);
for(int k=0;k<arr.length;k++){
System.out.print(arr[k]+",");
}
}
一.快速排序ast
// 從第一個值開始,人爲是中間值,從後往前依次比較,找到比他小的,替換位置,而後從前日後比較,找到比他大的交換這樣一次循環結束,遞歸比較左右兩側 public static void fastIndex(int [] arg) { int start=0; int end=arg.length-1; fastSort(arg,start,end); } public static void fastSort(int [] arr,int low,int high){ int start=low; int end=high; int key=arr[low]; while(end>start){ while (end>start&&arr[end]>=key) { end--; } if(arr[end]<=key){ int temp=arr[end]; arr[end]=arr[start]; arr[start]=temp; } while (end>start&&arr[start]<=key) { start++; } if(arr[start]>=key){ int temp=arr[start]; arr[start]=arr[end]; arr[end]=temp; } if(start>low){ fastSort(arr,low, start-1); } if(end<high&&end-1!=start){ fastSort(arr,end+1, high); } } } 二.冒泡排序法 從小到大 往上冒小值 //冒泡排序用時平均4.25毫秒,冒泡排序比選擇排序交換數據次數要多 public static void maoPaoSort(int[] arr){ int len=arr.length; int temp; //1)一種方式是:外層決定循環多少次,每次循環找出一個小值冒泡,每次外層循環結束 最後一個值是最大的 /*for(int i=0;i<len-1;i++){ for(int j=0;j<len-1-i;j++){ if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } }*/ //2)一種方式是:外層決定循環多少次,每次外層循環結束 找出一個最小值,最大值下沉,第一個值是最小的 for (int i=0;i<len-1;i++){ for(int j=len-1;j>i;j--){ if(arr[j-1]>arr[j]){ temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; } } } } 三.選擇排序 外層循環默認第一個值爲最小的,每次外層循環結束後找出一個最小值放到第當前外層循環第一位置。 //選擇排序用時平均2.5毫秒 選擇排序比冒泡排序交換數據次數少,節省時間 public static void selectSort(int[] arr){ int min; int minIndex; for (int i = 0; i < arr.length; i++) { min=arr[i]; minIndex=i; for(int j=i+1;j<arr.length;j++){ if(arr[j]<min){ min=arr[j]; minIndex=j; } } if(minIndex!=i){ int temp=arr[i]; arr[i]=min; arr[minIndex]=temp; } } } 四.插入排序 對於數值大的靠後 節省時間,插入排序至關於只有須要後一個 值比前面的小才循環移動,若是第一個就沒遇到,前面的值也不須要循環,節省循環次數及移動次數 //優先選擇 public static void insertSort(int[] arr){ for(int i=1;i<arr.length;i++){ int nextValue=arr[i]; int preIndex=i-1; while(preIndex>=0&&nextValue<arr[preIndex]){ arr[preIndex+1]=arr[preIndex]; preIndex--; } if(i!=preIndex+1){ arr[preIndex+1]=nextValue; } } } }