目  录

 

python高级(一)——
python数据模型(特殊方法)

python高级(二)——
python内置序列类型

python高级(三)——
字典和集合(泛映射类型)

python高级(四)——
文本和字节序列(编码问题)

python高级(五)——
python函数(一等对象)

python高级(六)——用一等函数实现设计模式

 

未完……(每周更新一两篇,共约20篇)

 

 

 

 CancellationToken的多种应用

我的博客链接:理解希尔排序

这是线程安全的最后一篇了,主要介绍CancellationToken的多种应用。

最近回顾了一下 《The C Programming
Language》,其中提到了一个用来演示
for 循环的小例子,如下:

1,ThreadPool直接启动线程,传递CancellationToken。

/** shell sort */
void shellsort(int[], int);

int main()
{
    int a[] = {1,23,34,24,32,25,31,3,36,40};
    int b[] = {32,31,30,29,28,27,26,25,24,23};
    shellsort(b, 10);
}

void shellsort(int v[], int n)
{
    int gap, i, j, temp;

    for(gap = n/2; gap > 0; gap /= 2) {
        for(i = gap; i<n; i++) {
            for(j=i-gap; j>=0 && v[j] > v[j+gap]; j-=gap) {
                temp = v[j];
                v[j] = v[j+gap];
                v[j+gap] = temp;
            }
        }
    }
}

2,Task启动线程,传递CancellationToken。Task传递方式分为两种,一种通过Task的参数进行传递,另一种通过向线程内传递对象的方式传递CancellationToken。

这是一个希尔排序的例子,以每次 n/2
为步长,比较步长两边的元素的大小,步长是从大到小的,也就是说,一开始直接比较相距较远的两个元素,如果是逆序,则直接交换,比基于相邻比较的排序(冒泡排序,交换排序)跨越了更多的中间位置;然后最终步长为1能够保证所有元素都能正确被排序。步长为1时,退化为交换排序,但是其实这时序列是已经经过排序的,所以要比一开始就用交换排序要好。

3,CancellationToken的回调函数应用。

希尔排序是第一批跨越 O(n2)
复杂度的排序算法之一。它是一种不稳定的排序算法,其性能与步长的取值有很大关系,Wikipedia上有关于各种步长选择下的性能比较:Shellsort#Gap_sequences。

话不多说,请看代码。

为了帮助理解希尔排序的排序过程,可以看这个演示视频(需FQ): Shell Sort
Algorithm Example

发表评论

电子邮件地址不会被公开。 必填项已用*标注