鱼C论坛

 找回密码
 立即注册
查看: 2110|回复: 1

[已解决]哪位大佬可以帮忙解释一下,感激(明天考试)急

[复制链接]
发表于 2019-3-1 20:47:53 | 显示全部楼层 |阅读模式
5鱼币
将互不相同元素的升序排列,重新存入数组a中,返回升序排列后互不相同元素的个数。


  1. #include <stdio.h>
  2. int sort(int a[],int n)
  3. {
  4.     int i,j,k,low,high,mid,t;
  5.     for(k=i=1;i<n;i++)
  6.     {
  7.         low=0;
  8.         high=k-1;
  9.         while(low<=high)
  10.         {
  11.             mid=(low+high)/2;
  12.             if(a[mid]>=a[i]) high=mid-1;
  13.             else  low=mid+1;
  14.         }
  15.         if(low>=k||a[low]!=a[i])
  16.         {
  17. /*******************FOUND*******************/
  18.             t=a[i];
  19. /*******************FOUND*******************/
  20.             for(j=k-1;j>=low;j--)
  21.                 a[j+1]=a[j];
  22.             a[low]=t;
  23.             k++;
  24.         }
  25.     }
  26.     return k;  
  27. }
  28. int main()
  29. {
  30.     int a[ ]={6,2,7,5,4,3,4,6,5,4};
  31.     int i,n;
  32.     n=sizeof(a)/sizeof(int);
  33.     for(i=0;i<n;i++)
  34.         printf("%d\t",a[i]);
  35. /*******************FOUND*******************/
  36.     n=sort(a,n);                    
  37.     printf("\nAfter sorting:\n");
  38.     for(i=0;i<n;i++)
  39.     printf("%d\t",a[i]);
  40.     printf("\n");
  41.     return 0;
  42. }
复制代码


最佳答案
2019-3-1 20:47:54
思路是从第二个数开始使用二分查找法,然后把元素插入找到的位置,时间复杂度应该是O(nlogn)

  1. #include <stdio.h>
  2. int sort(int a[], int n)
  3. {
  4.         int i, j, k, low, high, mid, t;
  5.         for (k = i = 1; i < n; i++)
  6.         {
  7.                 low = 0;
  8.                 high = k - 1;
  9.                 while (low <= high)    //二分查找,现在前k个数已经排序完毕,需要插入一个数a[i]
  10.                 {
  11.                         mid = (low + high) / 2;
  12.                         if (a[mid] >= a[i]) high = mid - 1;
  13.                         else  low = mid + 1;
  14.                 }                      //返回时,low==high+1。low的为第一个大于等于a[i]的位置,height为第一个小于a[i]的位置;
  15.                 if (low >= k || a[low] != a[i])        //当a[i]不与排列好的数字重复时
  16.                 {
  17.                         /*******************FOUND*******************/
  18.                         t = a[i];
  19.                         /*******************FOUND*******************/
  20.                         for (j = k - 1; j >= low; j--)      //把大于a[i]的元素都向后挪一步
  21.                                 a[j + 1] = a[j];
  22.                         a[low] = t;                          //插入a[i]
  23.                         k++;                               //现在有k+1个元素排列好了
  24.                 }
  25.         }
  26.         return k;
  27. }
  28. int main()
  29. {
  30.         int a[] = { 6,2,7,5,4,3,4,6,5,4 };
  31.         int i, n;
  32.         n = sizeof(a) / sizeof(int);
  33.         for (i = 0; i < n; i++)
  34.                 printf("%d\t", a[i]);
  35.         /*******************FOUND*******************/
  36.         n = sort(a, n);
  37.         printf("\nAfter sorting:\n");
  38.         for (i = 0; i < n; i++)
  39.                 printf("%d\t", a[i]);
  40.         printf("\n");
  41.         return 0;
  42. }
复制代码

最佳答案

查看完整内容

思路是从第二个数开始使用二分查找法,然后把元素插入找到的位置,时间复杂度应该是O(nlogn)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-1 20:47:54 | 显示全部楼层    本楼为最佳答案   
思路是从第二个数开始使用二分查找法,然后把元素插入找到的位置,时间复杂度应该是O(nlogn)

  1. #include <stdio.h>
  2. int sort(int a[], int n)
  3. {
  4.         int i, j, k, low, high, mid, t;
  5.         for (k = i = 1; i < n; i++)
  6.         {
  7.                 low = 0;
  8.                 high = k - 1;
  9.                 while (low <= high)    //二分查找,现在前k个数已经排序完毕,需要插入一个数a[i]
  10.                 {
  11.                         mid = (low + high) / 2;
  12.                         if (a[mid] >= a[i]) high = mid - 1;
  13.                         else  low = mid + 1;
  14.                 }                      //返回时,low==high+1。low的为第一个大于等于a[i]的位置,height为第一个小于a[i]的位置;
  15.                 if (low >= k || a[low] != a[i])        //当a[i]不与排列好的数字重复时
  16.                 {
  17.                         /*******************FOUND*******************/
  18.                         t = a[i];
  19.                         /*******************FOUND*******************/
  20.                         for (j = k - 1; j >= low; j--)      //把大于a[i]的元素都向后挪一步
  21.                                 a[j + 1] = a[j];
  22.                         a[low] = t;                          //插入a[i]
  23.                         k++;                               //现在有k+1个元素排列好了
  24.                 }
  25.         }
  26.         return k;
  27. }
  28. int main()
  29. {
  30.         int a[] = { 6,2,7,5,4,3,4,6,5,4 };
  31.         int i, n;
  32.         n = sizeof(a) / sizeof(int);
  33.         for (i = 0; i < n; i++)
  34.                 printf("%d\t", a[i]);
  35.         /*******************FOUND*******************/
  36.         n = sort(a, n);
  37.         printf("\nAfter sorting:\n");
  38.         for (i = 0; i < n; i++)
  39.                 printf("%d\t", a[i]);
  40.         printf("\n");
  41.         return 0;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 18:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表