java实现七种排序 (插入排序, 希尔排序, 插入排序, 快速排序, 简单选择排序, 堆排序, 归并排序)

本文介绍了Java中实现的七种排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序和归并排序。通过示例代码详细展示了每种排序算法的逻辑和实现方式。
摘要由CSDN通过智能技术生成
package java_study.sort;

import org.junit.Test;

import java.util.Random;

/**
 * Created by ethan on 2015/6/20.
 */
public class Sort7 {
    public int[] arr = init(10);

    public int[] init(int len){
        if (len==0) return null;
        int[] arr = new int[len];
        Random random = new Random();
        for (int i=0; i<len; i++){
           arr[i] =  random.nextInt(1000);
        }
        return arr;
    }

    // 插入排序
    public int[] sort_insert(int[] arr) {
        if (arr == null) return null;
        for (int i = 1; i < arr.length; i++) {
            int tmp = arr[i];
            int j = i - 1;
            for (; j >= 0 && tmp < arr[j]; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = tmp;
        }
        return arr;
    }

    // 希尔排序
    public int[] sort_shell(int[] arr) {
        if (arr==null) return null;
        int len = arr.length;
        for (int i=len/2; i>0; i/=2){
            for (int j=0; j<i; j++){
                for (int m=j; m<len; m+=i){
                    int tmp = arr[m];
                    int n=m-i;
                    for (; n>=j&&tmp<arr[n]; n-=i){
                        arr[n+i] = arr[n];
                    }
                    arr[n+i]=tmp;
                }
            }
        }

        return arr;
    }

    // 冒泡排序
    public int[] sort_bubble(int[] arr) {
        if (arr == null) return null;
        for (int i=0; i<arr.length-1; i++){
            for (int j=0; j<arr.length-i-1; j++){
                if (arr[j]>arr[j+1]){
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                }
            }
        }
        return arr;
    }

    // 快速排序
    public int[] sort_fast(int[] arr) {
        if (arr==null) return null;
        sort_fast_implement(arr, 0, arr.length-1);
        return arr;
    }
    public void sort_fast_implement(int[] arr, int start, int end){
        if (start < end){
            int index = partition(arr, start, end);
            if (start<index){
                sort_fast_implement(arr, start, index-1);
            }
            if (index<end){
                sort_fast_implement(arr, index+1, end);
            }
        }
    }
    public int partition(int[] arr, int start, int end){
        int tmp = arr[start];
        while (start<end){
            while (start<end&&tmp<arr[end]){
                end--;
            }
            arr[start] = arr[end];
            while (start<end&&tmp>arr[start]){
                start++;
            }
            arr[end]=arr[start];
        }
        arr[start]=tmp;
        return start;
    }
    // 选择排序
    public int[] sort_choose(int[] arr) {
        if (arr == null) return null;
        for (int i=1; i<arr.length; i++){
            int min_index = i-1;
            for (int j=i; j<arr.length; j++){
                if (arr[min_index]>arr[j]){
                    min_index=j;
                }
            }
            if (min_index!=i-1){
                int tmp = arr[min_index];
                arr[min_index] = arr[i-1];
                arr[i-1] = tmp;
            }
        }
        return arr;
    }

    // 堆排序 ==> 小根堆逆序, 大根堆顺序
    public int[] sort_heap(int[] arr) {
        if (arr==null) return null;
        build_heap(arr);
        for (int i=arr.length; i>0; i--){
            int tmp = arr[0];
            arr[0] = arr[i-1];
            arr[i-1] = tmp;
            heap_adjust(arr, 0, i-1);
        }
        return arr;
    }
    //建堆
    public void build_heap(int[] arr){
        if (arr==null) return;
        if (arr.length==1) return;
        int last = arr.length/2 - 1;
        for (int i=last; i>=0 ;i--){
            heap_adjust(arr, i, arr.length);
        }
    }
    //adjust
    public void heap_adjust(int[] arr, int index, int len){
        if (index<0) return;
        if (index>=len) return;
        int left = index*2+1;
        if (left>=len) return;
        int right = index*2+2;
        int max_index = left;
        if (right<len && arr[right]>arr[ max_index]){
             max_index = right;
        }
        if (arr[ max_index] > arr[index]){
            int tmp = arr[ max_index];
            arr[ max_index] = arr[index];
            arr[index] = tmp;
            heap_adjust(arr,  max_index, len);
        }
    }

    // 归并排序
    public int[] sort_merge(int[] arr) {
        int[] tmp = new int[arr.length];
        sort_merge_implement(arr, 0, arr.length-1, tmp);
        return arr;
    }
    //
    public void sort_merge_implement(int[] arr, int start, int end, int[] tmp){
        if (start<end){
            int mid = (start+end)/2;
            sort_merge_implement(arr, start, mid, tmp);
            sort_merge_implement(arr, mid+1, end, tmp);
            merge_two_sorted_array(arr, start, mid, end, tmp);
        }
    }
    // merge 两个有序的数组
    public void merge_two_sorted_array(int[] arr, int start, int mid, int end, int[] tmp){
        int start1 = start;
        int end1 = mid;
        int start2= mid+1;
        int end2 = end;
        int index = start;
        while(start1<=end1 && start2<=end2){
            if (arr[start1]<arr[start2]){
                tmp[index++] = arr[start1++];
            }else{
                tmp[index++] = arr[start2++];
            }
        }
        while(start1<=end1){
            tmp[index++] = arr[start1++];
        }
        while (start2<=end2){
            tmp[index++] = arr[start2++];
        }
        for (int i=start; i<=end; i++){
            arr[i] = tmp[i];
        }
    }

    // test
    @Test
    public void test_sort_insert() {
        System.out.println("insert sort...........");
        print_array(arr);
        print_array(sort_insert(arr));
    }

    @Test
    public void test_sort_shell() {
        System.out.println("shell sort...........");
        print_array(arr);
        print_array(sort_shell(arr));
    }

    @Test
    public void test_sort_bubble() {
        System.out.println("bubble sort...........");
        print_array(arr);
        print_array(sort_bubble(arr));
    }

    @Test
    public void test_sort_fast() {
        System.out.println("fast sort...........");
        print_array(arr);
        print_array(sort_fast(arr));
    }

    @Test
    public void test_sort_choose() {
        System.out.println("choose sort...........");
        print_array(arr);
        print_array(sort_choose(arr));
    }

    @Test
    public void test_sort_heap() {
        System.out.println("heap sort...........");
        print_array(arr);
        print_array(sort_heap(arr));
    }

    @Test
    public void test_sort_merge() {
        System.out.println("merge sort...........");
        print_array(arr);
        print_array(sort_merge(arr));
    }

    public void print_array(int[] arr) {
        if (arr == null) return;
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值