Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2422284
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类:

2010-08-13 22:09:23

一个时间复杂度为O(n),空间复杂度为O(1)的排序算法 收藏
 一个时间复杂度为O(n),空间复杂度为O(1)的排序算法
       有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    {
        while(e[i]!=i)
        {
            j++;
            t = e[e[i]]; /*下标为e[i]的元素,排序后其值就是e[i]*/
            e[e[i]] = e[i];
            e[i] = t;
            }
    }
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/l_r_h/archive/2007/05/18/1614163.aspx
阅读(3296) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~