简单排序--归并排序,快速排序
归并排序以及快速排序
针对于数据量大的排序,一般不会采用冒泡,选择,插入等时间复杂度为O(n²)的,效率上太慢;一般使用归并排序和快速排序时间复杂度为O(nlogn)
快速排序
采用分治的思想进行排序,以一个基准值(pivot)先区分出 area < pivot 的部分 和 area > pivot的部分,然后在进行排序,是一种自上而下的思想,它的处理过程是由上到下的,先分区,然后再处理子问题,是不稳定的
private void quickSort(int[] arr){
if (arr.length <= 1){
return;
}
// 针对每个部分进行排序
quickSort(arr,0,arr.length - 1);
}
private void quickSort(int[] arr,int low,int high){
if (low < high){
// 进行分区,获得两部分数据
int pivot = patition(arr,low,high);
quickSort(arr,low,pivot - 1);
quickSort(arr,pivot + 1,high);
}
}
private int patition(int[] arr,int low,int high){
// 基准值
int pivot = arr[low];
while(low < high){
while (low < high && pivot <= arr[high]) {
-- high;
}
arr[low] = arr[high];
while (low < high && pivot >= arr[low] ){
++ low;
}
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
} 归并排序
也是采用分治的思想进行排序,由下到上的,先处理子问题,然后再合并,是一种自下而上的思想,是稳定的,但是额外的使用了空间O(n),主要原因是合并函数无法在原地执行
private void mergeSort(int[] arr){
mergeSort(arr,0,arr.length - 1);
}
private void mergeSort(int[] arr, int low, int high) {
int mid = ( low + high ) / 2;
if(low < high){
mergeSort(arr,low,mid);
mergeSort(arr,mid + 1,high);
merge(arr,low,high,mid);
}
}
private void merge(int[] arr, int low, int high, int mid) {
int[] temp = new int[high - low + 1];
int i = low,j = mid + 1,k = 0;
while(i <= mid && j <= high){
if (arr[i] < arr[j]){
temp[k ++] = arr[i ++];
}else{
temp[k ++] = arr[j ++ ];
}
}
while (i <= mid){
temp [k ++] = arr[i ++ ];
}
while (j <= high){
temp [k ++] = arr[j ++];
}
for (int l = 0; l < temp.length; l++) {
arr[l + low] = temp[l];
}
}
未完。。
