zoukankan      html  css  js  c++  java
  • 一种特殊情况下 o(n) 复杂度的排序

    1,2,……,n这n个数,无序地保存在数组c[1..n]中,请编写一个时间复杂度为O(n)的排序算法,将数组c[1..n]按小到大排序。

    ------------------------

    思路: 由于这个数组很特殊,1到n个数,一一乱序保存在1,到n的数组中

    只需要对其遍历将a[i] 与 a[a[i]] 进行交换,知道 a[i] = i

    实现代码如下

     1 #include <stdio.h>
     2 
     3 void sort(int a[], int n)
     4 {
     5     int t, i;
     6     for(i = 1; i <= n; i++)
     7     {
     8         while(a[i] != i)  //a[i] 与 a[a[i]] 交换, 用t 来代替 a[i]
     9         {
    10             t = a[i];
    11             a[i] = a[t];
    12             a[t] = t;
    13         }
    14     }
    15 }
    16 
    17 void print(int a[], int n)
    18 {
    19     int i;
    20     for(i = 1; i <= n; i++)
    21     {
    22         printf("%d ", a[i]);
    23     }
    24     printf("
    ");
    25 }
    26 
    27 int main()
    28 {
    29     int a[11] = {0, 10, 8, 9, 7, 4, 1, 2, 3, 5, 6};
    30     print(a, 10);
    31     sort(a, 10);
    32     print(a, 10);
    33 }

    运行结果如下:

  • 相关阅读:
    BSGS
    聪聪可可(未完成)
    强连通分量,缩点
    bozj 1823(未完成)
    网络流
    bzoj1026
    点分治 poj1741
    bzoj 3270 博物馆
    高斯消元 模板
    bzoj 3143 [Hnoi2013]游走
  • 原文地址:https://www.cnblogs.com/hello-lijj/p/7158968.html
Copyright © 2011-2022 走看看