美文网首页
数据结构常用排序算法java版

数据结构常用排序算法java版

作者: sk邵楷 | 来源:发表于2019-07-25 15:00 被阅读0次
    
    package Sort;
    
    
    public class TestDemo01 {
    
        
        public static void main(String[] args) {
            
            int a[] = {2, 4, 6, 1, 7, 5};
            
    //      sort(a);  //直接插入排序
    //      sort2(a); //直接插入排序
    //      sort3(a); //希尔排序
    //      sort4(a); //简单选择排序
    //      sort5(a); //冒泡排序
    //      sort6(a, 0, a.length - 1); //快速排序
    //      sort7(a, 0, a.length - 1); //归并排序
    //      sort8(a); //堆排序
            
            
            
            for(int i = 0; i < a.length; i++){
                System.out.print(a[i]+ " ");
            }
        }
        
        
        
        /**
         * 直接插入排序
         * 通过交换进行插入排序,借鉴冒泡排序
         * @param a
         */
        public static void sort(int a[]){
            
            int length = a.length;
            
            for(int i = 0; i < length - 1; i++){
                for(int j = i + 1; j > 0; j--){
                    if(a[j] < a[j-1]){
                        int temp = a[j-1];
                        a[j-1] = a[j];
                        a[j] = temp;
                    }
                }
            }
        }
        
        /**
         * 直接插入排序
         * 通过将较大的元素都向右移动而不总是交换两个元素
         * @param a
         */
        public static void sort2(int a[]){
            
            for(int i = 1; i < a.length; i++){
                int num = a[i];
                int j;
                for(j = i-1; j >= 0; j--){
                    if(a[j] > num){
                        a[j+1] = a[j];
                    }else{
                        break;
                    }
                }
                a[j+1] = num;
            }
            
        }
        
        
        /**
         * 希尔排序
         * @param a
         */
        public static void sort3(int a[]){
            
            int length = a.length;
            int h = 1;
            while(h < length/3) h = 3*h +1;
            
            for( ; h >= 1; h /= 3){
                for(int i = 0; i < length - h; i += h){
                    for(int j = i+h; j > 0; j -= h){
                        if(a[j] < a[j-h]){
                            int temp = a[j];
                            a[j] = a[j-h];
                            a[j-h] = temp; 
                        }
                    }
                }
            }
            
        }
        
        
        /**
         * 简单选择排序
         * @param a
         */
        public static void sort4(int a[]){
            
            for(int i = 0; i < a.length; i++){
                int min = i;
                 //选出之后待排序中值最小的位置
                for(int j = i + 1; j < a.length; j++){
                    if(a[j] < a[min]){
                        min = j;
                    }
                }
                
                //最小值不等于当前值时进行交换
                if(min != i){
                    int temp = a[i];
                    a[i] = a[min];
                    a[min] = temp;
                }
            }
        }
        
        
        /**
         * 冒泡排序
         * @param a
         */
        public static void sort5(int a[]){
             //外层循环控制比较的次数
            for (int i = 0; i < a.length - 1; i++) {
              //内层循环控制到达位置
                for (int j = 0; j < a.length - i - 1; j++) {
                    //前面的元素比后面大就交换
                    if (a[j] > a[j + 1]) {
                        int temp = a[j];
                        a[j] = a[j + 1];
                        a[j + 1] = temp;
                    }
                }
            }
        }
        
        /**
         * 快速排序
         * @param a
         * @param low
         * @param high
         */
        public static void sort6(int a[], int low, int high){
            
            //已经排完
            if(low >= high){
                return;
            }
            
            int left = low;
            int right = high;
            
            //保存基准值
            int pivot = a[left];
            
            while(left < right){
                //从后向前找到比基准小的元素
                while(left < right && a[right] >= pivot)
                    right--;
                a[left] = a[right];
                //从前往后找到比基准大的元素
                while(left < right && a[left] <= pivot)
                    left++;
                a[right] = a[left];
            }
            
            a[left] = pivot;
            
            sort6(a, low, left - 1);
            sort6(a, left + 1, high);
        }
        
        
        /**
         * 归并排序
         * @param a
         * @param low
         * @param high
         */
        public static void sort7(int a[], int low, int high){
            
            if(low >= high){
                return;
            }
            
            int mid = (low + high) / 2;
            //左半边排序
            sort7(a, low, mid);
            //右半边排序
            sort7(a, mid+1, high);
            //归并
            merge(a, low, mid, high);
        }
        
        
        /**
         * 归并
         * @param a
         * @param low
         * @param mid
         * @param high
         */
        public static void merge(int a[], int low, int mid, int high){
            int aux[] = new int[a.length];
            int i;
            int j;
            int k;
            for(k = low; k <= high; k++){
                aux[k] = a[k];
            }
            
            for(i = low, j = mid + 1, k = low; i <= mid && j <= high; k++){
                if(aux[i] < aux[j]){
                    a[k] = aux[i];
                    i++;
                }else{
                    a[k] = aux[j];
                    j++;
                }
            }
            while(i <= mid) a[k++] = aux[i++];
            while(j <= high) a[k++] = aux[j++];
        }
        
        
        
        /**
         * 堆排序
         * @param a
         */
        public static void sort8(int a[]){
            
            for(int i = a.length-1; i > 0; i--){
                max_heapify(a, i);
                
                //堆顶元素(第一个元素)与Kn交换
                int temp = a[0];
                a[0] = a[i];
                a[i] = temp;
            }
            
        }
        
        public static void max_heapify(int a[], int n){
            int child;
            for(int i = (n-1)/2; i >= 0; i--){
                //左子节点位置
                child = 2 * i + 1;
                 //右子节点存在且大于左子节点,child变成右子节点
                if (child != n && a[child] < a[child + 1]) {
                    child++;
                }
                //交换父节点与左右子节点中的最大值
                if (a[i] < a[child]) {
                    int temp = a[i];
                    a[i] = a[child];
                    a[child] = temp;
                }
            }
            
        }
        
        
    }
    
    
    
    

    参考: https://www.cnblogs.com/morethink/p/8419151.html

    相关文章

      网友评论

          本文标题:数据结构常用排序算法java版

          本文链接:https://www.haomeiwen.com/subject/utehrctx.html