时间复杂度为O(N*logN)的常用排序算法主要有四个——快速排序、归并排序、堆排序、希尔排序
1.快速排序
·基本思想
随机的在待排序数组arr中选取一个元素作为标记记为arr[index](有时也直接选择起始位置),然后在arr中从后至前以下标j寻找比arr[index]小的数,然后从前至后以下标i寻找比arr[index]大的数,如果i<j则交换二者的值;重复以上操作,直到i>=j,之后交换arr[index]与arr[j]的值,同时在i>begin中递归排序标记值的左侧数组,在j<end中递归标记值的右侧数组,直到结束,排序完成。
·代码实现
这里只提供一种实现,快速排序有多种实现。
public void quickSort(int[] arr,int begin,int end) {
int i = begin,j = end;
//以开始下标的值为标记
int index = begin;
while(i<j) {
//从后到前寻找比标记小的值
/*
* 这里需要注意,只能先从后开始找,否则如果先从前找的话,
* 以后交换arr[j]与arr[index]的值会使比arr[index]大的值在左边
*/
while (arr[j]>=arr[index]&&i<j) {
j--;
}
//从前到后寻找比标记大的值
while (arr[i]<=arr[index]&&i<j) {
i++;
}
//如果i<j才交换
if (i<j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//将标记的值与arr[j]交换
int temp = arr[j];
arr[j] = arr[index];
arr[index] = temp;
//递归标记值的左右数组
if (i>begin) {
quickSort(arr,begin,i-1);
}
if (j<end) {
quickSort(arr,i+1, end);
}
}
·性能分析
快速排序其实是冒泡排序的一种改进,每次递归,都将整个数组拆分成两部分分别递归,每一次划分过程的时间复杂度为O(N),平均情况