总结一下归并排序和快排
归并排序:非原地排序,稳定排序,时间复杂度O(nlogn),空间复杂度O(n)。
public static void mergeSort(int[] list, int[] tempList, int head, int tail) {
if (head < tail) {
int middle = (head + tail) / 2;
mergeSort(list, tempList, head, middle);
mergeSort(list, tempList, middle + 1, tail);
merge(list, tempList, head, middle + 1, tail);
}
}
public static void merge(int[] list, int[] tempList, int head, int middle, int tail) {
int headEnd = middle - 1;
int rearStart = middle;
int tempIndex = head;
int tempLength = tail - head + 1;
while ((headEnd >= head) && (rearStart <= tail)) {
if (list[head] < list[rearStart]) {
tempList[tempIndex++] = list[head++];
} else {
tempList[tempIndex++] = list[rearStart++];
}
}
while (head <= headEnd) {
tempList[tempIndex++] = list[head++];
}
while (rearStart <= tail) {
tempList[tempIndex++] = list[rearStart++];
}
for (int i = 0; i < tempLength; i++) {
list[tail] = tempList[tail];
tail--;
}
}
快排:原地排序,不稳定排序,最好时间复杂度O(nlogn),最坏时间复杂度O(n2),平均时间复杂度O(nlogn)。
public static void quickSort(int[] list, int left, int right) {
if (left < right) {
int point = partition(list, left, right);
quickSort(list, left, point - 1);
quickSort(list, point + 1, right);
}
}
public static int partition(int[] list, int left, int right) {
int first = list[left];
while (left < right) {
while (left < right && list[right] >= first) {
right--;
}
swap(list, left, right);
while (left < right && list[left] <= first) {
left++;
}
swap(list, left, right);
}
return left;
}
public static void swap(int[] list, int left, int right) {
int temp;
if (list != null && list.length > 0) {
temp = list[left];
list[left] = list[right];
list[right] = temp;
}
}