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

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

来源:http://blog.csdn.net/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;
            }
    }
}

    原文作者:排序算法
    原文地址: https://blog.csdn.net/l_r_h/article/details/1614163
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞