圆排序算法可以通过在整数数组上绘制同心圆来可视化。比较位于彼此完全相反的同一圆上的数组元素,如果发现顺序错误,则将它们交换。这以递归方式进行,其中将数组划分为子数组,在上面重复上述过程,直到获得成对的排序元素,这些元素组合在一起便形成了一个排序数组。
简而言之,下面的两个步骤重复进行,而这些步骤中涉及交换操作。
- 将第一个元素与最后一个元素进行比较,然后将第二个元素与第二个最后一个元素进行比较,依此类推。
- 然后将数组分成两部分并递归直到数组中只有一个元素。
下图可以更好地解释它。
下面是上述算法的实现。
// 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