简单排序算法时间空间复杂度分析及应用(3)-快速排序
和之前的两种算法比较:
1.快速算法适合在n值(排序规模比较大)较大的场景下使用,快速排序算法时间会少一点。
2.冒泡排序和插入排序适合n值较小的场景下使用,如果待排序区并不是都杂乱无序,即有些区域是有序
的,使用冒泡排序和插入排序比较好一点。
3.快速排序适合用在次序分布随机的场景下应用。
快速排序过程中涉及到的新概念是:确定区元。该算法运用分层递归的思想,每一个递归层都会确定两个确定区元,然后每个确定区元下面又会确定两个区元,直至一个区元或者没有区元。
确定区元:指的是多个区元之间已经确定关系的待确定区域,即在某个方向上(由左向右或由右向左),区元的所有数据都小于或这都大于后面其他区元的所有数据,但是这些区域中的数都是未确定节点,即没经过排序的。这些区域被称为确定区元。
如下图所示
一般快速排序会把最后一个数据节点当作中间比较元素,这个元素插在两个确定区元的中间,然后区元内部再递归快速排序下去,
快速排序的图解:
快速排序java实现:
/*
* 快速排序 quickSort
* 快速排序时间复杂度nlog(n);
* @param 输入true为增序列,false为降序
*/
public static void quickSort(boolean flag){
int [] arr = array;
System.out.println(arr.length);
quicksort(arr , 0 , arr.length - 1 , flag);
}
private static void quicksort(int[] arr, int i, int j , boolean flag) {
// TODO Auto-generated method stub
if(i >= j) return;
int p = i , q = i , k ;
for( ; q < j ; ++ q)
{
if((arr[q] < arr[j]&&flag)||(arr[q] > arr[j] && !flag))
{
k = arr[q];
arr[q] = arr[p];
arr[p] = k;
++p;
}
}
//将中间比较元素放到连两个确定区元的中间,区元X:i至p-1。确定区元Y:p+1至j
if(p != q)
{
k = arr[q];
arr[q] = arr[p];
arr[p] = k;
}
//递归快速排序两个确定区元。
quicksort(arr , i , p-1 , flag);
quicksort(arr , p+1 , j , flag);
}
下面几个文章等再分析几个排序算法后,会分析比较这些算法的不同。