本帖最后由 蓝色骨头 于 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)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。 |