zoukankan      html  css  js  c++  java
  • 数组中重复出现的数字

    代码实现的不同方法用(#if 0 ..... #endif)注释

      1 #include<Windows.h>
      2 #include<stdio.h>
      3 #if 0
      4 //这种方法使用两个指针来遍历数组,运用两个for循环,时间复杂度为O(n^2),空间复杂度为O(1)
      5 void test()
      6 {
      7     int array[7] = { 0, 3, 1, 0, 2, 5, 3 };
      8     int i = 0;
      9     for (i = 0; i < 7;i++)
     10     {
     11         int j = i + 1;
     12         for (; j < 7; j++)
     13         {
     14             if (array[i] == array[j])
     15             {
     16                 printf("重复的数字为:%d 
    ", array[i]);
     17                 return;
     18             }
     19         }
     20     }
     21     if (i>=7)
     22         printf("没找到重复的数字
    ");
     23 }
     24 #endif 
     25 #if 0
     26 //这种方法是先通过冒泡排序将数组排序,时间复杂度为O(n^2),空间复杂度为O(1);
     27 void test()
     28 {
     29     int array[7] = { 2, 3, 1, 0, 2, 5, 3 };
     30     int i = 0;
     31     for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
     32     {
     33         int j = 0;
     34         for (j = 0; j < i; j++)
     35         {
     36             if (array[j] > array[i])
     37             {
     38                 int temp = array[j];
     39                 array[j] = array[i];
     40                 array[i] = temp;
     41             }
     42         }
     43     }
     44     for (i = 0; i < 6; i++)
     45     {
     46         if (array[i] == array[i + 1])
     47         {
     48             printf("重复出现的数字为:");
     49             printf("%d ", array[i]);
     50         }
     51     }
     52 }
     53 #endif
     54 //这种方法使用折半插入排序对数组进行排序
     55 //比较次数虽然为nlog(n)(以2为底),但是时间复杂度任然为O(N^2);
     56 
     57 void test()
     58 {
     59     int array[7] = { 0, 3, 1, 0, 2, 5, 3 };
     60     int i = 2;
     61     for (i = 2; i < sizeof(array) / sizeof(array[0]); i++)
     62     {
     63         int low = 1; int high = i - 1;
     64         int temp = array[i];
     65         while (low <= high)
     66         {
     67             int mid = (high - low) / 2 + low;
     68             if (temp < array[mid])
     69                 high = mid - 1;
     70             else
     71                 low = mid + 1;
     72         }
     73         //移动元素
     74         int j = 0;
     75         for (j = i - 1; j>=low; j--)
     76         {
     77             array[j + 1] = array[j];
     78         }
     79         array[low] = temp;
     80     }
     81     for (i = 0; i < sizeof(array)/sizeof(array[0])-1; i++)
     82     {
     83         if (array[i] == array[i + 1])
     84         {
     85             printf("重复出现的数字为:");
     86             printf("%d ", array[i]);
     87         }
     88     }
     89 }
     90 
     91 int main()
     92 {
     93     test();
     94     system("pause");
     95     return 0;
     96 }
     97 //在提一种思路,如果数组中的元素已经排好序了,则它的元素应该与它的下标相同,可以根据这个
     98 //方法实现快速的排序,从而找到重复的数字,当然,这种方法只针对特殊情况。
     99 //代码中尽管有两重循环,但每个数字最多只要交换两次就能找到属于它的位置,因此总的时间复杂度为O(n),
    100 //空间复杂度为O(1);
    101 #if 0
    102 bool duplicate(int numbers[], int *temp, int length)
    103 {
    104     if (numbers == NULL || length <= 0)
    105         return false;
    106     for (int i = 0; i < length; i++)
    107     {
    108         if (numbers[i]<0 || numbers[i]>length - 1)
    109             return false;
    110     }
    111     for (int i = 0; i < length; i++)
    112     {
    113         while (numbers[i] != i)
    114         {
    115             if (numbers[i] == numbers[numbers[i]])
    116             {
    117                 *temp = numbers[i];
    118                 return true;
    119             }
    120             //交换numbers[i]与numbers[numbers[i]]
    121             int t = numbers[i];
    122             numbers[i] = numbers[numbers[i]];
    123             numbers[numbers[i]] = t;
    124         }
    125     }
    126 }
    127 #endif
  • 相关阅读:
    wcf 调试
    adf 笔记
    oracle 自定义比较函数
    【SpringMVC】SpringMVC系列3之@PathVariable映射URL占位符参数
    【SpringMVC】SpringMVC系列2之@RequestMapping 映射约束请求
    【SpringMVC】SpringMVC系列1之HelloWorld
    【持续集成】[Jenkins]Job中如何传递自定义变量
    【持续集成】使用Jenkins实现多平台并行集成
    【云计算】Netflix 开源持续交付平台 Spinnaker
    【Other】推荐点好听的钢琴曲
  • 原文地址:https://www.cnblogs.com/love-you1314/p/9750664.html
Copyright © 2011-2022 走看看