最近在准备面试,手写快速排序、堆排序、归并排序在面试中被问到的几率挺大,于是今天写了一下把代码放在这,以便以后复习。
1、快速排序
package sort;
import java.util.Arrays;
public class QuickSort {
public static void quick(int[] nums, int left, int right){
if (left < right) {
int i = left, j = right, temp = nums[i];
while (i < j) {
while (i < j && nums[j] >= temp) --j;
if (i < j) nums[i] = nums[j];
while (i < j && nums[i] <= temp) ++i;
if (i < j) nums[j] = nums[i];
}
nums[i] = temp;
quick(nums, left, i - 1);
quick(nums, i + 1, right);
}
}
public static void main(String[] args) {
int[] nums = {2, 1, 9, 5, 3, 7};
quick(nums, 0, nums.length - 1);
System.out.println(Arrays.toString(nums));
}
}
2、堆排序
package sort;
import java.util.Arrays;
public class HeapSort {
public static void adjustHeap(int[] nums, int i, int length){
int temp = nums[i];
for(int k = 2 * i + 1; k < length; k = 2 * k + 1){
if(k + 1 < length && nums[k] > nums[k + 1]){
++k;
}
if(nums[k] < temp){
nums[i] = nums[k];
i = k;
}else{
break;
}
}
nums[i] = temp;
}
public static void swap(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public static void main(String[] args) {
int[] nums = {2, 1, 9, 5, 3, 7};
for(int i = nums.length / 2 - 1; i >= 0; --i){
adjustHeap(nums, i, nums.length);
}
for(int i = nums.length - 1; i > 0; --i){
swap(nums,0, i);
adjustHeap(nums, 0, i);
}
System.out.println(Arrays.toString(nums));
}
}
3、归并排序
package sort;
import java.util.Arrays;
public class MergeSort {
//临时数组,避免频繁的开辟空间。
private static int[] temp;
public static void sort(int[] nums, int left, int right){
if(left < right){
int mid = left + (right - left) / 2;
//归
sort(nums, left, mid);
sort(nums, mid + 1, right);
//并
merge(nums, left, mid, right);
}
}
//合并nums[left, mid] 与 nums[mid + 1, right]这两个有序数组
public static void merge(int[] nums, int left, int mid, int right){
int i = left, j = mid + 1, t = 0;
while(i <= mid && j <= right){
if(nums[i] <= nums[j]) temp[t++] = nums[i++];
else temp[t++] = nums[j++];
}
while (i <= mid) temp[t++] = nums[i++];
while (j <= right) temp[t++] = nums[j++];
//将有序数组拷贝到原数组
t = 0;
while(left <= right) nums[left++] = temp[t++];
}
public static void main(String[] args) {
int[] nums = {2, 1, 9, 5, 3, 7};
temp = new int[nums.length];
sort(nums,0, nums.length - 1);
System.out.println(Arrays.toString(nums));
}
}