常见排序算法-java实现

117 阅读1分钟

1、冒泡排序

public void bubbleSort(int[] nums) {
    for (int i = 0; i < nums.length; i++) {
        for (int j = 0; j < nums.length-1; j++) {
            if (nums[j] > nums[j+1]) {
                int temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
            }
        }
    }
}

2、插入排序

public void insertSort(int[] nums) {
    for (int i = 1; i < nums.length; i++) {
        int temp = nums[i];
        int index = i;
        //移动数据,指导找到符合条件的位置,进行插入
        while (index > 0 && nums[index-1] > temp) {
            nums[index] = nums[index-1];
            index--;
        }
        //插入数据
        nums[index] = temp;
    }
}

3、希尔排序

又称缩小增量排序,增量数组必须以 1 结尾

public void shellSort(int[] nums, int[] increments) {
    for (int i = 0; i < increments.length; i++) {
        shellInsert(nums, increments[i]);    
    }
}

public void shellInsert(int[] nums, int increment) {
    for (int i = increment; i < nums.length; i++) {
        //index表示开始索引,i表示结束索引,中间为一个增量范围
        int index = i - increment;
        int temp = nums[i];
        while (index >= 0 && nums[index] > temp) {
            nums[index+increment] = nums[index];
            index-=increment;
        }
        nums[index] = temp;
    }
}

4、简单选择排序

public void selectionSort(int[] nums) {
    int index;
    for (int i = 0; i < nums.length-1; i++) {
        index = i;
        for (int j = i+1; j < nums.length; j++) {
            if (nums[index] > nums[j]) {
                index = j;
            }
        }
        if (i != index) {
            int temp = nums[index];
            nums[index] = nums[i];
            nums[i] = temp;
        }
    }
}

5、快速排序

public int partition(int[] nums, int left, int right) {
    int base = nums[left];    //默认基准数
    while (left < right) {
        //从右往左,找一个比基准数小的数,并进行交换
        while (left < right && base <= nums[right]) {            right--;
        }
        nums[left] = nums[right];

        //从左往右,找一个比基准大的数,并进行交换
        while (left < right && nums[left] <= base) {
            left++;
        }
        nums[right] = nums[left];
    }
    nums[left] = base;    //后移动left,所以要填充left处的值
    return left;
}

public void quickSort(int[] nums, int left, int right) {
    if (left < right) {
        int partition= partition(nums, left, right);
        quickSort(nums, left, partition-1);
        quickSort(nums, partition+1, right);
    }
}

//调用函数
public void sort(int[] nums) {
    quickSort(nums, 0, nums.length-1);
}