📜  圆排序

📅  最后修改于: 2021-05-05 02:49:39             🧑  作者: Mango

圆排序算法可以通过在整数数组上绘制同心圆来可视化。比较位于彼此完全相反的同一圆上的数组元素,如果发现顺序错误,则将它们交换。这以递归方式进行,其中将数组划分为子数组,在上面重复上述过程,直到获得成对的排序元素,这些元素组合在一起便形成了一个排序数组。

简而言之,下面的两个步骤重复进行,而这些步骤中涉及交换操作。

  • 将第一个元素与最后一个元素进行比较,然后将第二个元素与第二个最后一个元素进行比较,依此类推。
  • 然后将数组分成两部分并递归直到数组中只有一个元素。

下图可以更好地解释它。

下面是上述算法的实现。

// CPP implementation of Circle Sort
#include
using namespace std;
  
// Function to perform circular swaps recursively
// This function returns true if there was a swap
// operation performed.
bool circleSortRec(int a[], int low, int high)
{
    bool swapped = false;
  
    // base case
    if (low == high)
        return false;
  
    // storing the upper and lower bounds
    // of list to be used later in the
    // recursive case
    int lo = low, hi = high;
  
    while (lo < hi)
    {
        // swaps the pair of elements
        // if true
        if (a[lo] > a[hi])
        {
            swap(a[lo], a[hi]);
            swapped = true;
        }
        lo++;
        hi--;
    }
  
    // special case arises only for list
    // of odd size
    if (lo == hi)
        if (a[lo] > a[hi + 1])
        {
            swap(a[low], a[hi+1]);
            swapped = true;
        }
  
    // recursive case to check the
    // traverse lists as sub lists
    int mid = (high - low) / 2;
    bool firstHalf = circleSortRec(a, low, low+mid);
    bool secondHalf = circleSortRec(a, low+mid+1, high);
  
    return swapped || firstHalf || secondHalf;
}
  
// This function mainly calls circleSortRec
void circleSort(int a[], int n)
{
    // Keep calling circleSortRec while
    // there is a swap operation.
    while (circleSortRec(a, 0, n-1))
    {
       ;
    }
}
  
// Driver program
int main()
{
    int a[] = {7, 5, 3, 1, 2, 4, 6, 8};
    int n = sizeof(a)/sizeof(a[0]);
  
    printf("\nUnsorted : ");
    for (int i=0; i

输出 :

Unsorted :  [6, 5, 3, 1, 8, 7, 2, 4]
Sorted :  [1, 2, 3, 4, 5, 6, 7, 8]

参考 :
SourceForge