Java实现的各种排序算法

220 阅读2分钟

参考资料:zhuanlan.zhihu.com/p/42586566

冒泡排序

排序原理

两两对比,每一次循环都保证最右边一个是最大的;

时间复杂度

冒泡排序因为要两个循环,因此复杂度是O(N2)O(N^2)

代码实现

public class BubbleSort {
    public static void main(String[] args) {
        int[] nums = {67, 1, 8, 33, 67, 100,2, 32, 27, 22};
        bubbleSort(nums);
        System.out.println(Arrays.toString(nums));
    }

    public static void bubbleSort(int[] nums) {
        int len = nums.length;
				// 注意这里的循环条件,外循环表示每次需要比较的长度,每一次循环结束都会-1
        for (int i = len-1; i > 0; i--) {
          	// 内循环从0开始依次相邻的两两比较
            for (int j = 0; j < i; j++) {
                if(nums[j]>nums[j+1]) {
                    int tmp = nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1] = tmp;
                }
            }
        }
    }
}

选择排序

排序原理

选择排序从左边开始,以第一个为标准,寻找右边里面所有的最小的值,并和标准值比较并互换位置;

时间复杂度

选择排序因为要两个循环,因此复杂度是O(N2)O(N^2)

代码实现

public class SelectionSortTest {
    public static void main(String[] args) {
        int[] nums = {67, 1, 8, 33, 67, 100,2, 32, 27, 22};
        selectionSort(nums);
        System.out.println(Arrays.toString(nums));
    }

    public static void selectionSort(int[] arr) {
        int temp, min = 0;
        for (int i = 0; i < arr.length - 1; i++) {
            min = i;
            // 循环查找最小值
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[min] > arr[j]) {
                    min = j;
                }
            }
            if (min != i) {
                temp = arr[i];
                arr[i] = arr[min];
                arr[min] = temp;
            }
        }
    }
}

快速排序

排序原理

快速排序的每一次排序,会选择一个基准值,然后把右边都变成比基准值大的,左边都变成比基准值小的;

时间复杂度

快排的时间复杂度是O(NlogN)O(Nlog^N)​ 。

代码实现

public class quickSortTest {

    public static void main(String[] args) {
        int[] nums = {67, 1, 8, 33, 67, 100,2, 32, 27, 22};
        quickSort(nums,0,nums.length-1);
        System.out.println(Arrays.toString(nums));
    }

    public static void quickSort(int[] nums,int low , int high) {
        if (low<high){
            int mid = getMid(nums, low, high);
            quickSort(nums, low, mid);
            quickSort(nums, mid+1, high);
        }
    }

    public static int getMid(int[] nums, int low, int high) {
        int index = nums[low];
      // 注意与index的比较要包含“等于”条件
        while (low<high) {
            while (low<high && nums[high]>=index) high--;
            nums[low] = nums[high];
            while (low<high && nums[low]<=index) low++;
            nums[high] = nums[low];
        }
        nums[low] = index;
        return low;
    }
}