冒泡、插入、快排、归并排序(Java)

1、重点:

快排 && 归并

2、代码

package com.my.test.sort;

import java.util.Arrays;

public class Sort
{
    // 插入排序
    private static void insertSort(int[] arr)
    {
        int len = arr.length;
        int j = 0;
        for (int i = 0; i < len; i++)
        {
            int temp = arr[i];
            for (j = i; j > 0 && temp < arr[j - 1]; j--)
            {
                arr[j] = arr[j - 1];
            }
            arr[j] = temp;
        }
    }
    
    // 冒泡排序
    private static void bubbleSort(int[] arr)
    {
        int len = arr.length;
        for (int i = 0; i < len - 1; i++)
        {
            for (int j = 0; j < len - 1 - i; j++)
            {

                if (arr[j] > arr[j+1])
                {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
    
    
    private static int getMiddle(int[] arr, int low, int high)
    {
        int baseValue = arr[low];
        while (low < high)
        {
            while (low < high && baseValue <= arr[high])
            {
                high--;
            }
            arr[low] = arr[high];

            while (low < high && baseValue >= arr[low])
            {
                low++;
            }
            arr[high] = arr[low];
        }
        arr[low] = baseValue;
        
        return low;
    }
    
    // 快排
    private static void quickSort(int[] arr, int low, int high)
    {
        if(low < high)
        {
            int middle = getMiddle(arr, low, high);
            quickSort(arr, low, middle - 1);
            quickSort(arr, middle + 1, high);
        }
    }

    public static void mergeSort(int[] arr)
    {
        if (arr == null || arr.length <= 0)
        {
            return;
        }
        mergeSort(arr, 0, arr.length - 1);
    }

    private static void mergeSort(int[] arr, int low, int high)
    {
        int mid = (low + high) / 2;
        if (low < high)
        {
            mergeSort(arr, low, mid);
            mergeSort(arr, mid + 1, high);
            mergeArr(arr, low, mid, high);
        }
    }

    // 合并两个有序数组
    private static void mergeArr(int[] arr, int low, int mid, int high)
    {
        int len = high - low + 1;
        int[] tmpArr = new int[len];

        // 标识要合并的两个有序数组的索引
        int first = low;
        int second = mid + 1;
        int newIdx = 0;

        // 合并元素
        while (first <= mid && second <= high)
        {
            if (arr[first] <= arr[second])
            {
                tmpArr[newIdx] = arr[first];
                first++;
            }
            else
            {
                tmpArr[newIdx] = arr[second];
                second++;
            }
            newIdx++;
        }

        // 加入剩余的元素
        while (first <= mid)
        {
            tmpArr[newIdx] = arr[first];
            newIdx++;
            first++;
        }

        while (second <= high)
        {
            tmpArr[newIdx] = arr[second];
            newIdx++;
            second++;
        }

        // 赋值给arr
        int temp = low;
        for (int i = 0; i < len; i++, temp++)
        {
            arr[temp] = tmpArr[i];
        }
    }
    
    public static void main(String[] args)
    {
        int[] arr = {4,5,6,1,2,0,3,7,8,9,10};
        // quickSort(arr, 0, arr.length - 1);
        // bubbleSort(arr);
        // insertSort(arr);
        mergeSort(arr);
        System.out.println(Arrays.toString(arr));
        
    }

}

猜你喜欢

转载自blog.csdn.net/zangdaiyang1991/article/details/88645292