奇偶排序问题之单向扫描

来源:互联网 发布:知乎 北上广深 编辑:程序博客网 时间:2024/05/01 11:58

看到July大神的奇偶排序问题,第一反应就是运用partition函数来实现


由于看了算导第二版的lumoto版之后,外加loop invariant证明的深刻影响,基本不太愿意写Hoare版的了。。。虽说文章实验发现元素交换次数多了,但是程序不太会出bug了


void OddEvenSort(int *a, int low, int high){i=low-1;for(j=low->high){if(a[j]%2!=0){i++;swap(a[i],a[j]);}}}

详细解析见 https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/06.07.md

经过和July师兄交流,看到曹博新添加的基于单向扫描的奇偶排序,通过循环不变性发现了区别

void oddEvenSort(int *data, int length) {    for (int i = 0, j = 0; j < length; ++j)     {        if (data[j] % 2)         {            int temp = data[i];            data[i++] = data[j];            data[j] = temp;        }    }}

我实现的版本,每一轮loop 保存的性质是 a[low, i]是奇数,a[i+1,j-1]是偶数,因此循环结束之后,最后一个奇数
index是i, 曹博的loop保存性质是a[low,i-1]是奇数,a[i,j-1]是偶数,初始的i不一样,我的是low-1,曹博的是low




看July大神的东西总能激发自己学习的斗志~~

0 0