七种排序

Posted on 2017-12-10 20:35  远大卓锐  阅读(79)  评论(0)    收藏  举报

import java.util.Random;
//所有排序后为从小到大
public class Sort {
    
    public static void main(String[] args) {
        Sort s=new Sort();
        int[] result = Sort.randomNumber(1,10000,1000);
        
        /*for(int k =0 ;k<result.length;k++){
            System.out.println(result[k]);
        }*/
        
        s.BubbleSort(result);                        //冒泡排序
        for(int k =0 ;k<result.length;k++){
            System.out.println(result[k]);
        }
        
        /*s.SelectionSort(result);                       //选择排序
        for(int k =0 ;k<result.length;k++){
            System.out.println(result[k]);
        }*/
        
        /*s.InsertSort(result);                                //插入排序
        for(int k =0 ;k<result.length;k++){
            System.out.println(result[k]);
        }*/
        
        /*s.ShellSort(result);                                 //希尔排序
        for(int k =0 ;k<result.length;k++){
            System.out.println(result[k]);
        }*/
        
        /*int start = 0;                                            //快速排序
        int end = result.length-1;
        s.QuickSort(result, start, end);
        for(int k =0 ;k<result.length;k++){
            System.out.println(result[k]);
        }*/
        
        /*s.MergeSort(result);                               //归并排序
        for(int k =0 ;k<result.length;k++){
            System.out.println(result[k]);
        }*/
        
        /*s.HeapSort(result);                                    //堆排序
        for(int k =0 ;k<result.length;k++){
            System.out.println(result[k]);
        }*/
    }
        
     public static int[] randomNumber(int min,int max,int n){
            //判断是否已经达到索要输出随机数的个数
            if(n>(max-min+1) || max <min){
                return null;
            }

            int[] result = new int[n]; //用于存放结果的数组

            int count = 0;
            while(count <n){
                int num = (int)(Math.random()*(max-min))+min;
                boolean flag = true;
                for(int j=0;j<n;j++){
                    if(num == result[j]){
                        flag=false;
                        break;
                    }
                }
                if(flag){
                    result[count] = num;
                    count++;
                }
            }
            return result;
        }

     public void BubbleSort(int[] a) {
         int temp=0;
         for(int i=a.length-1;i>0;i--) {
             for(int j=0;j<i;j++) {
                 if(a[j]>a[j+1]) {
                     temp=a[j];
                     a[j]=a[j+1];
                     a[j+1]=temp;
                 }
             }
         }
     }
    
     public void SelectionSort(int[] a) {
         for(int i=0;i<a.length-1;i++) {
             int k=i;
             for(int j=k+1;j<a.length;j++) {
                 if(a[k]>a[j]) {
                     k=j;
                 }
             }
             if(k!=i) {
                 int temp = a[i];
                    a[i] = a[k];
                    a[k] = temp;
             }
         }
     }
    
     public void InsertSort(int[] a) {
         int temp=0;
         for(int i=1;i<a.length;i++) {
             for(int j=i;j>0;j--) {
                 if(a[j]<a[j-1]) {
                     temp=a[j];
                     a[j]=a[j-1];
                     a[j-1]=temp;
                 }
             }
         }
     }
             
     public void ShellSort(int[] a){
            if(a == null || a.length <= 1){
                return;
            }
            //增量
            int incrementNum = a.length/2;
            while(incrementNum >=1){
                for(int i=0;i<a.length;i++){
                    //进行插入排序
                    for(int j=i;j<a.length-incrementNum;j=j+incrementNum){
                        if(a[j]>a[j+incrementNum]){
                            int temple = a[j];
                            a[j] = a[j+incrementNum];
                            a[j+incrementNum] = temple;
                        }
                    }
                }
                //设置新的增量
                incrementNum = incrementNum/2;
            }
        }
    
     public void QuickSort(int[] a,int low,int high){
         int start = low;
         int end = high;
         int key = a[low];
                  
         while(end>start){
             //从后往前比较
             while(end>start&&a[end]>=key)  //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
                 end--;
             if(a[end]<=key){
                 int temp = a[end];
                 a[end] = a[start];
                 a[start] = temp;
             }
             //从前往后比较
             while(end>start&&a[start]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
                start++;
             if(a[start]>=key){
                 int temp = a[start];
                 a[start] = a[end];
                 a[end] = temp;
             }
         //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
         }
         //递归
         if(start>low)
             QuickSort(a,low,start-1);//左边序列。第一个索引位置到关键值索引-1
         if(end<high)
             QuickSort(a,end+1,high);//右边序列。从关键值索引+1到最后一个
     }
    
     public void MergeSort(int[] a) {  
            sort(a, 0, a.length - 1);  
        }
     public static void sort(int[] a, int left, int right) {  
            if (left >= right)  
                return;  
            // 找出中间索引  
            int center = (left + right) / 2;  
            // 对左边数组进行递归  
            sort(a, left, center);  
            // 对右边数组进行递归  
            sort(a, center + 1, right);  
            // 合并  
            merge(a, left, center, right);  
        }        
        /**
         * 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序
         *  
         * @param a
         *            数组对象
         * @param left
         *            左数组的第一个元素的索引
         * @param center
         *            左数组的最后一个元素的索引,center+1是右数组第一个元素的索引
         * @param right
         *            右数组最后一个元素的索引
         */  
     public static void merge(int[] a, int left, int center, int right) {  
            // 临时数组  
            int[] tmpArr = new int[a.length];  
            // 右数组第一个元素索引  
            int mid = center + 1;  
            // third 记录临时数组的索引  
            int third = left;  
            // 缓存左数组第一个元素的索引  
            int tmp = left;  
            while (left <= center && mid <= right) {  
                // 从两个数组中取出最小的放入临时数组  
                if (a[left] <= a[mid]) {  
                    tmpArr[third++] = a[left++];  
                } else {  
                    tmpArr[third++] = a[mid++];  
                }  
            }  
            // 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)  
            while (mid <= right) {  
                tmpArr[third++] = a[mid++];  
            }  
            while (left <= center) {  
                tmpArr[third++] = a[left++];  
            }  
            // 将临时数组中的内容拷贝回原数组中  
            // (原left-right范围的内容被复制回原数组)  
            while (tmp <= right) {  
                a[tmp] = tmpArr[tmp++];  
            }  
        }  
    
     public static void swap(int[] a, int i, int j) {  
            if (i == j) {  
                return;  
            }  
            a[i] = a[i] + a[j];  
            a[j] = a[i] - a[j];  
            a[i] = a[i] - a[j];  
        }
     public void HeapSort(int[] a) {  
            for (int i = 0; i < a.length; i++) {  
                createMaxdHeap(a, a.length - 1 - i);  
                swap(a, 0, a.length - 1 - i);   
            }  
        }  
     public static void createMaxdHeap(int[] a, int lastIndex) {  
            for (int i = (lastIndex - 1) / 2; i >= 0; i--) {  
                // 保存当前正在判断的节点  
                int k = i;  
                // 若当前节点的子节点存在  
                while (2 * k + 1 <= lastIndex) {  
                    // biggerIndex总是记录较大节点的值,先赋值为当前判断节点的左子节点  
                    int biggerIndex = 2 * k + 1;  
                    if (biggerIndex < lastIndex) {  
                        // 若右子节点存在,否则此时biggerIndex应该等于 lastIndex  
                        if (a[biggerIndex] < a[biggerIndex + 1]) {  
                            // 若右子节点值比左子节点值大,则biggerIndex记录的是右子节点的值  
                            biggerIndex++;  
                        }  
                    }  
                    if (a[k] < a[biggerIndex]) {  
                        // 若当前节点值比子节点最大值小,则交换2者得值,交换后将biggerIndex值赋值给k  
                        swap(a, k, biggerIndex);  
                        k = biggerIndex;  
                    } else {  
                        break;  
                    }  
                }  
            }  
        }
}

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3