首页 > 其他分享 >双调排序-适合并行多核计算

双调排序-适合并行多核计算

时间:2024-12-09 16:44:00浏览次数:6  
标签:sort cnt 双调 int 多核 low 排序 order dir

// Source : https://www.geeksforgeeks.org/bitonic-sort/

/* C++ Program for Bitonic Sort. Note that this program
   works only when size of input is a power of 2. */

#include <algorithm>
#include <iostream>

/*The parameter dir indicates the sorting direction, ASCENDING
   or DESCENDING; if (a[i] > a[j]) agrees with the direction,
   then a[i] and a[j] are interchanged.*/
void compAndSwap(int a[], int i, int j, int dir) {
    if (dir == (a[i] > a[j]))
        std::swap(a[i], a[j]);
}

/*It recursively sorts a bitonic sequence in ascending order,
  if dir = 1, and in descending order otherwise (means dir=0).
  The sequence to be sorted starts at index position low,
  the parameter cnt is the number of elements to be sorted.*/
void bitonicMerge(int a[], int low, int cnt, int dir) {
    if (cnt > 1) {
        int k = cnt / 2;
        for (int i = low; i < low + k; i++) compAndSwap(a, i, i + k, dir);
        bitonicMerge(a, low, k, dir);
        bitonicMerge(a, low + k, k, dir);
    }
}

/* This function first produces a bitonic sequence by recursively
    sorting its two halves in opposite sorting orders, and then
    calls bitonicMerge to make them in the same order */
void bitonicSort(int a[], int low, int cnt, int dir) {
    if (cnt > 1) {
        int k = cnt / 2;

        // sort in ascending order since dir here is 1
        bitonicSort(a, low, k, 1);

        // sort in descending order since dir here is 0
        bitonicSort(a, low + k, k, 0);

        // Will merge wole sequence in ascending order
        // since dir=1.
        bitonicMerge(a, low, cnt, dir);
    }
}

/* Caller of bitonicSort for sorting the entire array of
   length N in ASCENDING order */
void sort(int a[], int N, int up) { bitonicSort(a, 0, N, up); }

// Driver code
int main() {
    int a[] = {3, 7, 4, 8, 6, 2, 1, 5};
    int N = sizeof(a) / sizeof(a[0]);

    int up = 1;  // means sort in ascending order
    sort(a, N, up);

    std::cout << "Sorted array: \n";
    for (int i = 0; i < N; i++) std::cout << a[i] << " ";
    return 0;
}
 

标签:sort,cnt,双调,int,多核,low,排序,order,dir
From: https://www.cnblogs.com/FastEarth/p/18595376

相关文章

  • 数据结构--排序
    排序是计算机科学与技术领域中的一项基本操作,旨在将一组数据按某种顺序排列。以下是几种常见排序算法的具体解释:一、冒泡排序(BubbleSort)工作原理冒泡排序算法的工作原理如下:比较相邻的元素。如果第一个比第二个大(对于升序排序,如果是降序则相反),就交换它们两个。对每一对......
  • 数组中的逆序对:基于归并排序的高效解法
    问题背景在算法和数据结构领域,"逆序对"是一个经典的计算问题。逆序对定义为数组中前面的元素大于后面的元素的数对。例如,在序列[7,5,6,4]中,存在的逆序对包括:(7,5)(7,6)(7,4)(5,4)(6,4)问题分析问题要求给定一个整数数组,要求计算数组中所有逆序对的总数。暴力解法的局......
  • 数据结构 (33)选择类排序
    前言    数据结构中的选择类排序主要包括简单选择排序(也称为选择排序)和堆排序。一、简单选择排序基本思想:简单选择排序是一种直观易懂的排序算法。它的工作原理是,在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最......
  • 数据结构 (34)归并排序
    前言    归并排序(MergeSort)是一种高效、稳定的排序算法,它采用分治法的思想,将待排序的序列分为若干个子序列,然后对这些子序列进行排序,最后再将排好序的子序列合并成一个完整的有序序列。一、基本思想    归并排序的核心思想是分治法,即将大问题分解为小问题......
  • python - pandas排序
    如果进行简单升降序使用以下功能一般就够用importpandasaspd#数据df=pd.DataFrame({'A':['a','c','b','d','a'],'B':[5,4,3,2,1]})#按照B列值进行排序#ascending为True代表升序,False为降序#na_position为First代表空值放在最后,First......
  • 每周练手(3)希尔排序和二叉排序树
    前言 大家好呀,这里是正值期末忙得不可开交的猫猫,虽然还有很多实验报告和作业要做,但本周依然少不了固定的每周一练啦,好了,废话少说,我们开始吧。一、二叉排序树题目描述构造一棵二叉排序树,从小到大输出树中所有值大于指定值x的结点值。题目分析构造一棵二叉排序树(也称为......
  • 用函数实现扑克牌排序
    functionsortPokerCards(cards){//定义牌面值和花色对应的数字constranks={'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'T':10,'J':11,......
  • 数据结构 (31)插入类排序
    前言     数据结构中的插入类排序是一种简单直观的排序算法,其核心思想是通过构建有序序列,将未排序的数据逐个插入到已排序的序列中,直到所有元素都排序完毕。一、基本思想    插入排序的基本思想是将数组分为已排序和未排序两部分,初始时,已排序部分只包含一......
  • 数据结构 (32)交换类排序
    前言     交换排序是一类基于比较和交换元素位置的排序算法。其核心思想是通过两两比较待排元素的关键字(或称为key值),若发现与排序要求相逆(即逆序),则交换这两个元素的位置,直到所有元素都排序完毕。一、冒泡排序(BubbleSort)基本思想:通过反复比较相邻的元素,根据......
  • vxe-table 树表格跨层级拖拽排序
    vxe-table树表格跨层级拖拽排序,通过row-drag-config.isCrossDrag启用跨层级拖拽官网:https://vxetable.cn/<template><div><vxe-gridv-bind="gridOptions"></vxe-grid></div></template><script>exportdefault{da......