快速排序
网上的说法
- 选择第一个数位p,小于p的数放在左边, 大于p的数放在右边
- 递归的将p左边和右边的数都按照第一步进行,直到不能递归
具体怎么实现的
1 看了公式后,我脑海里浮现的是这么一幅画面,取出第一个数位基准,记录起始和结尾数的下标
2 临时取出起始下标和临时结尾下标,分别与基准数进行对比 ,然后将临时起始数与临时结尾数交换,每交换一轮小标往中心移动 ,知道两者相遇算完成一轮
这样的结果是将基准数大的移到右边,小的移动左边
3 继续从起始点和临时基准点的值也就是左半部分, 继续重复第二部
这样的结果是这次起始点位中心 大的移到右边,小的一道左边
4 右半部分和左半部分一样 进行交换
小结
我理解来的核心思想是,取任意一个数位为基准,将小于这个数的放左边大于的放右边,左半部分(起始值小于临时值)和右半部分(结束值大于临时结束值)还有继续比较分割,一直切到不能分为止,依我看来,每次切割后,开启线程来做排序的事,会更快
为什么说左半部分和左半部分需要继续分呢?
因为例如左半部分的值只能代表比第一轮还小的值,需要再验证一轮左半部分第一个值是否是最小的值
public static void quickSort(int[]number,int start,int end){
if(start < end){
int base = numbers[start];
int temp;
int i = start ,j=end;
do{
whilte((numbers[i] < base) && (i <end)){
i++
}
whilte((numbers[i] > base) && (j < end)){
j --;
}
if(i < = i){
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
i ++;
j--;
}
}whilte(i <= j)
if(start < j){
quickSort(numbers,start,j);
}
if(end > i){
quickSort(numbers,i)
}
}
}