六大排序算法(插冒归堆选择快排)

计划花一个月时间刷刷数据结构与算法,先拿排序热热身吧。

import java.util.Random;

public class Sort {

    /**
     * 插入排序
     * */
    public  void insertSort(int[]a,int len){
        if(len<=0){
            return;
        }
        for(int i=1;i<len;i++){
            int temp = a[i];
            int j = i-1;
            while(j>=0 && a[j]>temp){
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = temp;
        }
    }

    /**
     * 选择排序
     * @param a
     * @param n
     */
    public void selectSort(int[] a,int n){
        if(n<=0){
            return;
        }
        for (int i = 0; i < n-1 ; i++) {
            int m = i;
            for(int j = i+1;j< n ;j++){
                if(a[j] < a[m]){
                    m = j;
                }

            }
            if(m!=i){
                int t = a[i];
                a[i] = a[m];
                a[m] = t;
            }

        }
    }

    /**
     * 冒泡排序
     * @param a
     * @param n
     */
    public void bubbleSort(int[] a,int n){
        if(n<=0)
            return;
        for(int i=0;i<n;i++){
            for(int j=0;j<n-i-1;j++){
                if(a[j]>a[j+1]){
                    int t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }
    }

    /**
     * 快速排序
     * @param a
     * @param n
     */
    public void quickSort(int a[],int n){

        int left = 0;
        int right = n-1;
        quickSort(a,left,right);

    }

    public void quickSort(int a[],int left,int right){
        if(left>right)
            return;
        int index = partition(a,left,right);
        quickSort(a,left,index-1);
        quickSort(a,index+1,right);
    }

    public int partition(int a[],int left,int right){
        int i = left,j = right;
        int temp = a[i];
        while(i<j){
            while(i<j && a[j]>temp)
                j--;
            if(i<j)
               a[i++] = a[j];

            while(i<j && a[i]<temp)
                i++;
            if(i<j)
                a[j--] = a[i];

        }
        a[i] = temp;
        return i;
    }

    /**
     * 二路归并排序
     * @param a
     * @param n
     */
    public void mergeSort(int a[],int n){
        int left = 0;
        int right = n-1;
        mergeSort(a,left,right);
    }

    public void mergeSort(int a[],int left,int right){
        if(left>=right)
            return;
        int mid = (left + right)/2;
        mergeSort(a,left,mid);
        mergeSort(a,mid+1,right);
        merge(a,left,right,mid);

    }

    public void merge(int a[],int left,int right,int mid){
        int n = right-left+1;
        int b[] = new int[n];
        int i = left, j = mid+1;
        int k = 0;
        while(i<=mid && j<=right){
            if(a[i]<a[j]){
                b[k++] = a[i++];
            }else{
                b[k++] = a[j++];
            }
        }

        while(i<=mid){
            b[k++] = a[i++];
        }

        while (j<=right){
            b[k++] = a[j++];
        }

        for (k = 0; k < n; k++) {
            a[left+k] = b[k];
        }
    }

    /**
     * 堆排序(从小到大排序,建大根堆)
     * @param a
     * @param n
     */
    public void heapSort(int a[],int n){
        int right = n - 1;
        buildHeap(a,right);
        for(int i=right;i>=0;i--){
            int temp = a[0];
            a[0] = a[i];
            a[i] = temp;
            adjustHeap(a,0,i-1);
        }

    }

    public void buildHeap(int a[],int n){
        for(int i = n / 2;i >= 0;i--){
            adjustHeap(a,i,n);
        }
    }

    public void adjustHeap(int a[],int i,int n){
        int temp = a[i],j;
        for(j = 2*i;j < n;j *= 2){
            if(j<n && a[j]<a[j+1]){
                j++;
            }
            if(temp<a[j]){
                a[i] = a[j];
                i = j;
            }
        }
        a[i] = temp;
    }

    /**
     * 随机生成一个数组
     * */
    public int[] randomArray(int n,int left,int right){
        int array[] = new int[n];
        Random random = new Random();
        int interval = right -left;
        for(int i=0;i<n;i++){
            int temp = random.nextInt(interval) + left;
            array[i] = temp;
        }
        return  array;
    }

    /**
     * 输出数组中的值
     * @param array
     * @param n
     */
    public void print(int[] array,int n){
        for(int i=0;i<n;i++){
            System.out.println(array[i]);
        }
    }

    public static void main(String args[]){
        Sort sort = new Sort();
        int n = 10;
        int[] array = sort.randomArray(n,0,50);
        System.out.println("初始数组为:");
        sort.print(array,n);
        System.out.println("");
        sort.insertSort(array,n);
        sort.selectSort(array,n);
        sort.bubbleSort(array,n);
        sort.quickSort(array,n);
        sort.mergeSort(array,n);
        sort.heapSort(array,n);
        sort.print(array,n);




    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值