排序算法

插入排序

思想

  1. 只要局部有序,那么整体就有序。
  2. 每次插入数据前,先遍历哪个比自己大,哪个比自己小,找到插入的位置。
  3. 最后找到之后再交换就可以了。

实现

public static void doSort(int[] arr) {
	for (int i = 1; i < arr.length ; i++) {
		int insertValue = arr[i];
		int j = i - 1;

		while (j >= 0) {
			if (arr[j] > insertValue) {
				arr[j + 1] = arr[j];
			} else {
				break;
			}

			j--;
		}

		arr[j + 1] = insertValue;
	}
}

快速排序

思想

  1. 只要保证局部小范围有序,那么整体就有序。
  2. 递归实现,切分到不能切分为止。
  3. 切分原则,选出基准值,然后不停切分,保证左右两个区间的值,左区间的值小于基准值,右区间的值大于基准值。然后不停的选出范围中的基准值,我使用的是最右边的值基准值。
  4. 选出来基准值了,那么就遍历数组,将数组中小于基准值的值,与交换标记位的值交换。

实现

public class QuickSortImpl {

    public static void swap(int[] arr, int startIdx, int endIdx) {
        int temp = arr[startIdx];
        arr[startIdx] = arr[endIdx];
        arr[endIdx] = temp;
    }


    public static int splitForBase(int[] arr, int start, int end) {
        int base = arr[end];
        int i = start - 1;

        for (int j = start ; j < end ; j++) {
            if (arr[j] < base) {
                i++;
                swap(arr, i, j);
            }
        }

        swap(arr, i + 1, end);
        return i + 1;
    }

    public static void doSort(int[] arr, int start, int end) {
        if (start < end) {
            int base = splitForBase(arr, start, end);
            doSort(arr, start, base - 1);
            doSort(arr, base, end);
        }
    }
}
posted @ 2023-04-28 13:57  sunpeiyu  阅读(2)  评论(0编辑  收藏  举报