简介
快速排序是一种既不浪费空间又可以快一点的排序算法。快速排序只用了本身一个数组,没有使用额外的数组空间。
实现逻辑
- 先从数组中取一个数作为基准数(通常取第一个数)
- 分区,将比这个数大的数全放到它的右边,小的数全放到它的左边
- 再对它的左边和右边继续分区,直到各区间只有一个数
代码(java)
// l:数组的开始下标 r:数组的结束下标
public void QuickSort(int[] nums,int l,int r){
if (l>r){
return;
}
// 选择一个目标值(通常以数组的第一个数为目标)
int value=nums[l];
int i=l,j=r;
while (i<j){
// 将目标值与数组的最后一个值比较,如果大于目标,则将索引往前移位
while (i<j&&value<=nums[j]){
j--;
}
// 将目标值与数组的第一个值比较,如果小于目标,则将索引往后移位
while (i<j&&value>=nums[i]){
i++;
}
// 防止nums[i]>nums[j],这里会有两种情况,一种是i=j,一种是i<j并且nums[i]>nums[j]
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
// 交换目标值,使得数组中在目标值左边的都小于它,右边的都大于它
nums[l]=nums[i];
nums[i]=value;
// 将目标值左边的数组和右边的数组继续进行排序
QuickSort(nums,l,i-1);
QuickSort(nums,i+1,r);
}