快速排序的原理:选择一个关键值做为基准值。比基准值小的都在左边序列(通常是无序的),比基准值大的都在右边(通常是无序的)。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; } } } }