循环排序

入门

理解"最少写入"的排序策略,适合理解循环分解。

用你自己的数组跑一遍

AlgoAnim · 循环排序
速度
待机
// 源代码
1void cycleSort(int arr[], int n) {
2    for (int cycle = 0; cycle < n - 1; cycle++) {
3        int item = arr[cycle];
4        int pos = cycle;
5        for (int i = cycle + 1; i < n; i++)
6            if (arr[i] < item) pos++;
7        if (pos == cycle) continue;
8        while (item == arr[pos]) pos++;
9        swap(arr[pos], item);
10        while (pos != cycle) {
11            pos = cycle;
12            for (int i = cycle + 1; i < n; i++)
13                if (arr[i] < item) pos++;
14            while (item == arr[pos]) pos++;
15            swap(arr[pos], item);
16        }
17    }
18}

复杂度分析

时间 O(n²)
空间 O(1)
最优 O(n)
最坏 O(n²)

算法讲解

循环排序将数组分解为若干个循环,每个循环内的元素通过交换到达正确位置。

它的核心思想是:对于每个位置,计算它应该放哪个元素,然后循环交换。

写入次数为 O(n),是理论上写入次数最少的排序算法。

适合闪存等写入代价高的存储介质。