题解 | #排序#
排序
http://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896
题目
描述
- 给定一个数组,请你编写一个函数,返回该数组排序后的形式。
方法一
思路
- 题目要求对数组进行升序排序,可以使用冒泡排序来对数组进行排序。
具体步骤
方法二
思路
- 方法一运行超时,的时间复杂度无法完美解决问题,那么就考虑使用的排序算法,就选与冒泡排序属于同一类的快速排序吧。
- 介绍一下快速排序:快速排序的基本思想是基于分治法的,在待排序数组arr中任取一个元素i,作为基准,通过一趟排序将待排序数组划分为两个独立的部分arr[0,k-1](所有元素小于i),arr[k+1,n](所有元素大于i),i放在arr[k]上,这是一次快排。接着,再对两个子数组进行递归快排即可。
具体步骤
- 参考下图示例:
- 代码如下:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] arr) {
// write code here
quickSort(arr,0,arr.length-1);
return arr;
}
private void quickSort(int[] arr,int low,int high){
if (low < high){
// 划分为两个子数组
int pivotpos = partition(arr,low,high);
// 递归快排
quickSort(arr,low,pivotpos-1);
quickSort(arr,pivotpos+1,high);
}
}
private int partition(int[] arr,int low,int high){
// 默认取最低位
int pivot = arr[low];
while(low < high){
while(low < high && arr[high] >= pivot)
--high;
// 将比基准小的值移到左端
arr[low] = arr[high];
while(low < high && arr[low] <= pivot)
++low;
// 将比基准大的值移到右端
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
}
- 时间复杂度:,当数组基本有序或者基本逆序时,最坏时间复杂度为,而平均时间复杂度为。
- 空间复杂度:,最坏情况下需要进行n-1次递归调用,所以是。