基于时间复杂度为O(n)的排序算法

介绍了一种针对1到N无序数组的特殊排序算法,该算法能在O(n)的时间复杂度和O(1)的空间复杂度下完成排序,通过巧妙地交换元素位置实现高效排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     引题:有1,2,….一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1)。
  快速排序被认为是速度最快算法 ,时间复杂度是:nlog(n),下面这个是O(n),当然是有一定的条件的,不具普遍性,但是它的思路还是挺有技巧的。
  1~N的数组,那么排序后必然a[0]=1,a[1]=2,a[2]=3........也就是元素值必定是存放在比值小1的数组元素中,那么只需 a[n]和a[a[n]-1]相交换即可。有1,2,....一直到n 的无序数组, 求排序算法, 并且要求时间复杂度为O(n),空间复杂度O(1),使用交换, 而且一次只能交换两个数.(华为)
#include 
int main() 
{ 
    int a[]  = {10,6,9,5,2,8,4,7,1,3}; 
    int len = sizeof(a) / sizeof(int); 
    int temp; 
    for(int i = 0; i < len; ) 
    { 
	temp = a[a[i] - 1]; 
	a[a[i] - 1] = a[i]; 
	a[i] = temp; 
	if ( a[i] == i + 1) 
      	i++; 
    }
    for (int j = 0; j < len; j++) 
      cout<<a[j]<<","; 
    return 0; 
} 


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值