一个时间复杂度为O(n),空间复杂度为O(1)的排序算法

本文探讨了一种时间复杂度为O(n)、空间复杂度为O(1)的排序算法。算法核心在于利用数组下标与排序后元素值的关系,通过不断交换实现排序。对于面试者而言,这个题目不仅测试了对基本排序算法的理解,还考察了思维敏捷性和细致程度。

 一个时间复杂度为O(n),空间复杂度为O(1)的排序算法

来源:http://blog.youkuaiyun.com/rerli/archive/2003/12/18/19041.aspx#508832

       有N个大小不等的自然数(1--N),请将它们由小到大排序。
       要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。

 

从这道题出题意图来看,出题者主要是想考面试者的思维是否敏捷清醒、做事是否认真仔细是否善于思考、基本知识掌握程度如何。为什么这么说呢,第一这道题的确不难,就是一般排序。排序的方法在数据结构中讲得实在是太多了,各种各样的选择排序、插入排序、冒泡排序、希尔排序、堆排序、快速排序等等。但是,用心的人就记得它们当中没有一个算法复杂度是O(n),且不说空间复杂度要满足O(1)。第二就是这道题真正的考点就是看你能否想到数组的下标与这N个数存在的关系。这就是考题中的个小玄机。这N个数随你怎么乱序,排好序后就是数组(让下标从1开始)下标为1的元素,里面放的就一定是1,下标为n的元素,里面放的就一定是N。观察出这点,题目就解决了。

 

void sort(int e[], int n)
{
    int i;
    int t; /*临时变量:空间复杂度O(1)*/
    for (i=1; i<n+1; i++) /*时间复杂度O(n)*/
    {
        while(e[i]!=i)
        {
            j++;
            t = e[e[i]]; /*下标为e[i]的元素,排序后其值就是e[i]*/
            e[e[i]] = e[i];
            e[i] = t;
            }
    }
}

### 满足时间复杂度为 O(n)空间复杂度为 O(1)排序算法设计 要设计一个时间复杂度为 O(n)空间复杂度为 O(1)排序算法,通常需要依赖特定的限制条件,例如数据范围有限。以下是一个基于计数思想的排序算法,适用于数据范围较小的整数排序场景。 #### 算法思想 该算法利用一个固定大小的数组来记录每个整数是否出现过,从而实现线性时间复杂度的排序。由于固定大小的数组与输入数据规模 n 无关,因此空间复杂度为 O(1)。此方法适用于已知且有限的数据范围,例如 0 到 65535 之间的整数。 #### 算法实现 ```cpp #include <iostream> using namespace std; // 排序能力,[0,65535] 区间的数字,可以根据需要调整范围 const int MAXN = 65535; bool hashArray[MAXN]; // 固定大小的数组,空间复杂度为 O(1) template<typename T> void Sort(T arr[], int n) { // 初始化 hashArray 为 false for (int i = 0; i < MAXN; ++i) { hashArray[i] = false; } // 标记出现过的元素 for (int i = 0; i < n; ++i) { hashArray[arr[i]] = true; } // 重新填充排序后的元素 int k = 0; for (int i = 0; i < MAXN; ++i) { if (hashArray[i]) { arr[k++] = i; } } } // 打印数组 void show(int arr[], int n) { for (int i = 0; i < n; ++i) { cout << arr[i] << " "; } cout << endl; } int main() { int arr[] = {5, 6, 9, 2, 3, 7, 4, 1, 8}; int n = sizeof(arr) / sizeof(arr[0]); cout << "原始数组: "; show(arr, n); Sort(arr, n); // 调用排序函数 cout << "排序后数组: "; show(arr, n); return 0; } ``` #### 算法分析 - **时间复杂度**: - 初始化 `hashArray` 的时间复杂度为 O(MAXN),其中 MAXN 是固定值。 - 遍历输入数组并标记元素出现的时间复杂度为 O(n)。 - 遍历 `hashArray` 并重新填充排序后数组的时间复杂度为 O(MAXN)。 - 总体时间复杂度为 O(n + MAXN),即 O(n) [^2]。 - **空间复杂度**: - 使用了一个固定大小的数组 `hashArray`,其大小与输入数据规模 n 无关,因此空间复杂度为 O(1) [^2]。 #### 适用场景 该算法适用于数据范围有限且已知的整数排序场景,例如对 0 到 65535 之间的整数进行排序。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值