Java排序算法

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

相关文章
相关标签/搜索