當前位置:編程學習大全網 - 編程語言 - 並發算法之並行排序

並發算法之並行排序

大部分排序算法都是串行執行的,當排序元素很多時,使用並行排序算法可以有效利用CPU,提高運算效率,但將串行算法改成並行算法將會極大的增加原有算法的復雜度。

1、分離數據相關性:奇偶交換排序

冒泡排序:如果數據較小,會逐步被交換到前面,對於大的數字會下沈,交換到數組的尾部。

在每次叠代交換過程中,由於每次交換的兩個元素存在數據沖突,對於每個元素,它既可能與前面的元素交換,也可能與後面的元素交換,因此很難直接改成並行算法。如果能夠解開這種數據的相關性,就可以更容易的使用並行算法,奇偶交換排序就是基於這種思想的。

對於奇偶交換排序,它將排序過程分成兩個階段,奇交換和偶交換。奇交換總是比較奇數索引及其相鄰的後續元素,而偶交換總是比較偶數索引及其相鄰的後續元素。並且奇交換和偶交換會成對出現,這樣才能保證比較和交換涉及到數組中的每壹個元素。在每個階段內,所有的比較和交換是沒有數據相關性的,每次比較和交換都可以獨立執行。

flag用來記錄當前叠代釋放發生了數據交換,start用來表示奇交換或偶交換。初始start=0,表示進行偶交換,每次叠代結束切換start狀態。如果上次比較交換發生了數據交換,或當前正在進行的是奇交換,循環不會停止,直到不再發生交換,並且當前進行的是偶交換為止。

2、改進的插入排序:希爾排序

插入排序思想:壹個未排序的數組可以分為兩部分,前半部分是已排序的,後半部分是未排序的,在進行排序時,只需在未排序的部分中選擇壹個元素,將其插入到前面有序的數組中即可。最終未排序的部分越來越少,直至為0排序完成。

插入排序很難並行化,因為上壹次的數據插入依賴於上壹次得到的有序序列,多個步驟之間無法並行。

希爾排序將整個數組根據間隔h分割為若幹個子數組,子數組相互穿插在壹起,每次排序時分別對每壹個子數組進行排序。每次排序時總是交換間隔為h的兩個元素。在每組排序完成後,可以遞減h的值,進行下輪排序,直到h=1,此時等價於壹次插入排序。

希爾排序優點:即使壹個較小的元素在數組末尾,由於每次元素移動都以間隔h進行,數組末尾的元素可以在很少的交換次數下,被置換到最接近元素最終位置的地方。

改造成並行希爾排序:

--參考文獻《實戰Java高並發程序設計》

  • 上一篇:西門子PLC如何呼叫子程式
  • 下一篇:飛利浦臺燈護眼燈廠家飛利浦臺燈護眼燈種類
  • copyright 2024編程學習大全網