C++ 中的位排序


位排序是一種並行排序演算法,它被建立用於最佳實現,並且與硬體和並行處理器陣列一起使用時具有最佳用途。

雖然與歸併排序相比,它並不是最有效的排序演算法。但它非常適合並行實現。這是由於預定義的比較順序使得比較獨立於要排序的資料。

為了使位排序有效地工作,元素的數量應為特定型別的數量,即 2^n 階。

位排序的一個主要部分是位排序序列,它是一個元素值先增加然後減少的序列。

位排序序列是一個數組 arr[0 … (n-1)],如果在 0 到 n-1 的範圍內存在一個索引值 i。對於該索引值,arr[i] 的值在陣列中最大。即

arr[0] <= arr[1] … <= arr[i] and arr[i] >= arr[i+1] … >= aar[n-1]

位排序序列的特殊特徵 -

  • 位排序序列可以旋轉回位排序序列。

  • 元素按遞增和遞減順序排列的序列是位排序序列。

建立位排序序列

為了建立位排序序列,我們將建立兩個子序列,一個包含升序元素,另一個包含降序元素。

例如,讓我們看看序列 arr[] 並將以下序列轉換為位排序序列。

arr[] = {3, 4, 1, 9, 2, 7, 5, 6}

首先,我們將元素配對,然後以一種方式建立這些元素的位排序序列,使得一個按升序排列,另一個按降序排列,依此類推。

對於我們的陣列,讓我們按位排序序列建立對。

arr[] = {(3, 4), (1, 9), (2, 7), (5, 6)}
// creating bitonic sequence pairs…
arr[] = {(3, 4), (9, 1), (2, 7), (6, 5)}

然後,我們將建立這些對的對,即 4 個元素的位排序序列,並將元素與距離為 2 的元素進行比較 [即 i 與 i+2]。

arr[] = {(3, 4, 9, 1), (2, 7, 6, 5)}

第一組中的升序位排序將建立為 -

(3, 4, 9, 1) : comparing two distant elements.
(3, 1, 9, 4) : Now, check adjacent elements.
(1, 3, 4, 9) -> ascending bitonic sequence.

第二組中的降序位排序將建立為 -

(2, 7, 6, 5) : comparing two distant elements.
(6, 7, 2, 5) : Now, check adjacent elements.
(7, 6, 5, 2) -> descending bitonic sequence.

最後,我們將得到大小為 8 的位排序序列。

1, 3, 4, 9, 7, 6, 5, 2

現在,既然我們已經瞭解了位排序序列。我們將瞭解位排序

位排序

使用以下步驟使用位排序對位排序序列進行排序 -

步驟 1 - 建立一個位排序序列。

步驟 2 - 現在,我們有一個位排序序列,其中一部分按升序排列,另一部分按降序排列。

步驟 3 - 我們將比較並交換兩半的第一個元素。然後是第二個、第三個、第四個元素。

步驟 4 - 我們將比較並交換序列的每個第二個元素。

步驟 5 - 最後,我們將比較並交換序列的相鄰元素。

步驟 6 - 在所有交換之後,我們將得到排序後的陣列。

示例

顯示位排序實現的程式 -

 線上演示

#include<iostream>
using namespace std;
void bitonicSeqMerge(int a[], int start, int BseqSize, int direction) {
   if (BseqSize>1){
      int k = BseqSize/2;
      for (int i=start; i<start+k; i++)
      if (direction==(a[i]>a[i+k]))
      swap(a[i],a[i+k]);
      bitonicSeqMerge(a, start, k, direction);
      bitonicSeqMerge(a, start+k, k, direction);
   }
}
void bitonicSortrec(int a[],int start, int BseqSize, int direction) {
   if (BseqSize>1){
      int k = BseqSize/2;
      bitonicSortrec(a, start, k, 1);
      bitonicSortrec(a, start+k, k, 0);
      bitonicSeqMerge(a,start, BseqSize, direction);
   }
}
void bitonicSort(int a[], int size, int up) {
   bitonicSortrec(a, 0, size, up);
}
int main() {
   int a[]= {5, 10, 51, 8, 1, 9, 6, 22};
   int size = sizeof(a)/sizeof(a[0]);
   printf("Original array: \n");
   for (int i=0; i<size; i++)
   printf("%d\t", a[i]);
   bitonicSort(a, size, 1);
   printf("\nSorted array: \n");
   for (int i=0; i<size; i++)
   printf("%d\t", a[i]);
   return 0;
}

輸出

Original array:
5 10 51 8 1 9 6 22
Sorted array:
1 5 6 8 9 10 22 51

更新於: 2020-08-05

877 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.