楼主: afc
跳转到指定楼层
上一主题 下一主题
收起左侧

[二分/排序/搜索] 最简洁的快速排序

🔗
austurela 2013-11-19 00:13:05 | 只看该作者
全局:
北美农民 发表于 2013-11-10 04:12
快排什么版本都见过, 我就写这种。 不见得比我简洁吧.

第6行直接(left + right) / 2就行了嘛

点评

这是为了避免他们的和越界.  发表于 2013-11-19 00:41
回复

使用道具 举报

🔗
austurela 2013-11-19 01:28:35 | 只看该作者
全局:
北美农民 发表于 2013-11-10 04:12
快排什么版本都见过, 我就写这种。 不见得比我简洁吧.

能举个(left + right) / 2和越界的例子吗?

点评

如果left + right大于上界就溢出了. 除以2是第二步.  发表于 2013-11-19 01:42
回复

使用道具 举报

🔗
austurela 2013-11-19 01:56:57 | 只看该作者
全局:
北美农民 发表于 2013-11-10 04:12
快排什么版本都见过, 我就写这种。 不见得比我简洁吧.

int pivot = a[(left + right) / 2];
这个怎么会溢出?就算左右同时是上届除以二也不会溢出吧

点评

中间步骤溢出了难道还指望结果正确? 在自己机器上试试很难吗?!  发表于 2013-11-19 02:07
回复

使用道具 举报

🔗
austurela 2013-11-19 02:53:35 | 只看该作者
全局:
北美农民 发表于 2013-11-10 04:12
快排什么版本都见过, 我就写这种。 不见得比我简洁吧.
  1. 我是真自己试过才回帖的,有那种情况会溢出您给个edge case?
复制代码

  1. package Sorting;
  2. import java.util.*;

  3. public class test {
  4.        
  5.         public static void main(String[] arg) throws Exception{

  6.                 Random myRandom = new Random();
  7.                 QuickSortTest myQuicksort = new QuickSortTest();
  8.                
  9.                 // Test 1000 times
  10.                 for(int i = 0; i < 1000; i++){
  11.                         // Create a random array
  12.                         int[] toTest = new int[10];
  13.                         for(int k = 0; k < 10; k++){
  14.                                 toTest[k] = myRandom.nextInt(100);
  15.                         }
  16.                         System.out.println("Before: " + Arrays.toString(toTest));
  17.                         myQuicksort.qsort(toTest);
  18.                         System.out.println("After: " + Arrays.toString(toTest) + "\n");
  19.                 }
  20.                
  21.                 // Test edge cases
  22.                 int[] toTest = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  23.                 System.out.println("Before: " + Arrays.toString(toTest));
  24.                 myQuicksort.qsort(toTest);
  25.                 System.out.println("After: " + Arrays.toString(toTest) + "\n");
  26.                
  27.                 int[] toTest2 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
  28.                 System.out.println("Before: " + Arrays.toString(toTest2));
  29.                 myQuicksort.qsort(toTest);
  30.                 System.out.println("After: " + Arrays.toString(toTest2) + "\n");
  31.                
  32.                 int[] toTest3 = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  33.                 System.out.println("Before: " + Arrays.toString(toTest3));
  34.                 myQuicksort.qsort(toTest);
  35.                 System.out.println("After: " + Arrays.toString(toTest3) + "\n");
  36.         }
  37. }
复制代码



回复

使用道具 举报

🔗
austurela 2013-11-19 02:54:56 | 只看该作者
全局:
北美农民 发表于 2013-11-10 04:12
快排什么版本都见过, 我就写这种。 不见得比我简洁吧.

用的这个code
  1. package Sorting;

  2. public class QuickSortTest {

  3.         public void qsort(int[] a){
  4.                 qsort(a, 0, a.length - 1);
  5.         }
  6.        
  7.         private void qsort(int[] a, int start, int end) {   
  8.                    if (end <= start) return; // 其实这句可有可无, 只要调用的时候不故意出错
  9.                   
  10.                    int left = start;
  11.                    int right = end;
  12.                    //int pivot = a[left + (right - left) / 2];
  13.                    int pivot = a[(left + right) / 2];

  14.                    // selection
  15.                    while (left <= right) {
  16.                        while (a[left] < pivot) left ++;
  17.                        while (a[right] > pivot) right --;
  18.                        if (left <= right) {
  19.                          int tmp = a[left];
  20.                          a[left] = a[right];
  21.                          a[right] = tmp;
  22.                          left ++;
  23.                          right --;
  24.                        }
  25.                    }
  26.                   
  27.                    // divide
  28.                    if (left < end) qsort(a, left, end);
  29.                    if (right > start) qsort(a, start, right);
  30.                 }

  31. }
复制代码
回复

使用道具 举报

无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
🔗
北美农民 2013-11-19 03:35:39 | 只看该作者
全局:
austurela 发表于 2013-11-18 13:59
Before: [5, 57, 51, 9, 75, 3, 65, 50, 86, 63]
After: [3, 5, 9, 50, 51, 57, 63, 65, 75, 86]

    int a = Integer.MAX_VALUE - 10;
    int b = Integer.MAX_VALUE - 1;
    int c;
   
    c = (a + b) / 2;
    System.out.println(c);
    c = a + (b - a) / 2;
    System.out.println(c);
    c = (a + b) >>> 1;
    System.out.println(c);

run this code
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表