黑马程序员技术交流社区
标题:
关于快速排序的问题
[打印本页]
作者:
ぺsimon☆
时间:
2013-4-11 16:45
标题:
关于快速排序的问题
兄弟们好
有个问题我想问一下:
快速排序和折半排序是一样的吗,是不是只是叫法不同而已呢?
如果不是一样的,那他们有什么区别呢?
作者:
庄生晓梦
时间:
2013-4-11 17:09
快速排序是排序方法。
折半查找是是一种查找方法。
作者:
刘林虎
时间:
2013-4-11 17:28
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
作者:
蓝色骨头
时间:
2013-4-11 17:39
本帖最后由 蓝色骨头 于 2013-4-11 17:53 编辑
快速排序和折半排序是一样的吗,是不是只是叫法不同而已呢?
快速排序是一种最常用的排序方式,随机化的快速排序的效率为nlgn,比较排序的最高效率也就是nlgn
下面是随机化快速排序的实现方式
private static void mySwitch(int[] arr, int i, int j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
private static int partition(int[] arr, int left, int right){
Random rand = new Random();
int mid = rand.nextInt(right - left + 1) + left;
int i = left - 1;
mySwitch(arr, mid, right);
/*
* 把 所有比mid小的移到左边
* i 记录第一个比mid大的起始位置
*/
for(int j = left; j < right; j++){
if(arr[j] <= arr[right]){
i++;
mySwitch(arr, i, j);
}
}
mySwitch(arr, i+1, right);
return i+1;
}
public static void quikSort(int[] arr, int left, int right){
if(left>right){
return;
}
int[] stack = new int[arr.length];
int top = 0;
stack[top++] = left;
stack[top++] = right;
while(top>0){
int Right = stack[--top];
int Left = stack[--top];
int p = partition(arr,Left,Right);
if(p-Left>1){
stack[top++] = Left;
stack[top++] = p-1;
}
if(Right-p>1){
stack[top++] = p+1;
stack[top++] = Right;
}
}
}
复制代码
折半排序没有听说过,有折半插入排序
折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。
作者:
黄玉昆
时间:
2013-4-11 19:44
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者:
ぺsimon☆
时间:
2013-4-14 19:33
黄玉昆 发表于 2013-4-11 19:44
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢 ...
哦,好的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2