快速排序
快速排序采用分治策略。1. 首先拿到数组的第一个数作为target标记数,把数组中比标记数大的都移到它的左边,比标记数小的都移到它的右边。2. 把数组分成标记数之前和之后的两部分,每个部分均按照步骤1中的思路排序。重复上述中1和2操作,直到分成的数组只有一个数时。因为此时数组已经是升序排序了。
很明显重复步骤1和2的操作,适合用递归来完成,而递归的边界条件就是数组中只有一个数。
public static void quickSort(int[] dp, int l, int r) {
if(l >= r)
return;
int i = l, j = r;
int target = dp[l];
//步骤一,取出一个数target,把所有小于它的数放到它的左边,大于它的放在右边
while(i < j) {
//双指针对数组进行操作
//从右边开始做j--,直到发现小于target得数,进行交换
while(i < j && dp[j] >= target) j--;
//交换两个数
dp[j] = (dp[i] + dp[j]) - (dp[i] = dp[j]);
//从左边开始做i++,直到发现大于target得数,进行交换
while(i < j && dp[i] <= target) i++;
//交换两个数
dp[j] = (dp[i] + dp[j]) - (dp[i] = dp[j]);
}
//步骤二,把数组分成target左右两部分,递归进行上述操作
quickSort(dp, l, i-1);
quickSort(dp, i+1, r);
}
public static void main(String[] args) {
int[] dp = {4,5,1,6,2,7,3,8};
quickSort(dp, 0, dp.length - 1);
for (int i : dp) {
System.out.print(i + " ");
}
}
---------------------------------------------------------------------
1 2 3 4 5 6 7 8
Process finished with exit code 0
时 间 复 杂 度 O ( n ∗ l o g n ) , 空 间 复 杂 度 O ( n ) 时间复杂度O(n*log~n),空间复杂度O(n) 时间复杂度O(n∗log n),空间复杂度O(n)