排序算法
排序,意义上就是在一个乱序的数组上,经过一系列的操作,让这个数组按照定义的“大小”升序或者降序的排列。这个过程就是排序的过程。
[TOC]
1. 快速排序
/**
* 快速排序算法
*
* @param arr 待排序的属猪
* @param l 左边位置
* @param r 右边位置
*/
private static void qSort(int[] arr, int l, int r) {
if (l < r) {
int partition = getPartition(arr, l, r);
qSort(arr, l, partition - 1);
qSort(arr, partition + 1, r);
}
}
/**
* 荷兰国旗的问题
*
* @param arr 排序数组
* @param l 左边位置
* @param r 右边位置
* @return 返回分割好后的中间位置
*/
private static int getPartition(int[] arr, int l, int r) {
int temp = arr[l];
while (l < r) {
while (l < r && arr[r] >= temp) r--;
arr[l] = arr[r];
while (l < r && arr[l] <= temp) l++;
arr[r] = arr[l];
}
arr[r] = temp;
return l;
}
快速排序算法他的时间复杂度是O(logN),空间复杂度是O(1)。
存在的问题:有的时候,在快速排序的过程中,有可能会发生分配不均的问题,导致时间复杂度升高。这个时候,我们可以使用随机快速排序来解决这个问题。
2. 归并排序
/**
* 进行归并排序
*
* @param nums 带排序数组
* @param left 左边位置
* @param right 右边位置
*/
private static void mergeSort(int[] nums, int left, int right) {
if (left != right) {
int mid = (left + right) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
// 随后合并两个排序数组
int[] sorted = new int[right - left + 1];
int p1 = left, p2 = mid + 1;
int p = 0;
// 合并操作
while (p1 <= mid || p2 <= right) {
if (p1 > mid) {
sorted[p++] = nums[p2++];
} else if (p2 > right) {
sorted[p++] = nums[p1++];
} else {
if (nums[p1] < nums[p2]) {
sorted[p++] = nums[p1++];
} else {
sorted[p++] = nums[p2++];
}
}
}
// 设置新值
for (int k = 0; k < sorted.length; k++) {
nums[left + k] = sorted[k];
}
}
}
归并排序采用的也是分治的思想,时间复杂度也是O(logN).