圈养的野马 发表于 2020-10-27 20:49:42

c语言,如何优化程序运行时间

开课吧学习平台做闯关题,这个闯不过去了,有大神给优化一下吗,总是提醒运行超出限制时间, 在其他平台这个可以没问题。

这是题干:给予 10 个乱序输入的整数。你需要(任选一种排序方法)将它们从大到小进行排序后输出;
#include <stdio.h>
void swap(int *a,int *b)
{
    int k;
    k = *a;
    *a = *b;
    *b = k;
}
int main() {
    int n = 10;
    int numbers;
    int i;
    int j;
    // 读入给定的数字
    for (i = 0; i < n ;i++)
    {
      scanf("%d", &numbers);
    }
    for(i = 0;i < n; i++)
   {
      for(j = 0;j < n-i;j++)
      {
            if(numbers < numbers)
            {
                swap(&numbers,&numbers);
            }
      }
    }
    for(i = 0;i < n;i++)
    {
      printf("%d",numbers);
      if(i != (n-1))
      {
            printf(" "); //最后一个整数后面不能有空格
      }
    }
    return 0;
}

aammoo 发表于 2020-10-27 20:58:43

你这个排序算法不行,优化也没多大意义,改算法吧

Himem 发表于 2020-10-27 21:02:53

直接用qsort库函数多省心

wye11083 发表于 2020-10-27 22:21:13

aammoo 发表于 2020-10-27 20:58
你这个排序算法不行,优化也没多大意义,改算法吧

这只有10个数,根据经验,小于100个数我都通通冒泡,效率最高。lz这估计是平台bug,编译出来死循环了。

剑舞 发表于 2020-10-28 08:18:03

本帖最后由 剑舞 于 2020-10-28 08:19 编辑

{:lol:} {:lol:} {:lol:}

圈养的野马 发表于 2020-10-28 10:16:16

aammoo 发表于 2020-10-27 20:58
你这个排序算法不行,优化也没多大意义,改算法吧

对,改变算法,今天尝试一下,不用冒泡法

zyqcome 发表于 2020-10-28 11:50:28

冒泡的最差情况是n!
不考虑开销,试一试用链表插值排,
初始化链表o1,
排序,最差情况,n*n,n个数据,循环n遍
输出o1

圈养的野马 发表于 2020-10-29 18:11:33

改变了算法就行了
下面代码替代冒泡法
for(i = 0;i < n; i++)
    {   
      max = numbers;
      for(j = i;j < n;j++)
      {
            if(max < numbers)
            {
                max = numbers;
                index = j;
            }
            if(j == n-1 && max == numbers )
                {
                  swap(&numbers,&numbers);

                }      
      }
    }

圈养的野马 发表于 2020-10-29 18:12:38

zyqcome 发表于 2020-10-28 11:50
冒泡的最差情况是n!
不考虑开销,试一试用链表插值排,
初始化链表o1,


小白还写不出来链表{:lol:} ,请朋友不吝赐教{:handshake:}

圈养的野马 发表于 2020-10-29 18:50:06

Himem 发表于 2020-10-27 21:02
直接用qsort库函数多省心

厉害,函数后面在研究研究你说的这个函数

zyqcome 发表于 2020-10-30 08:54:17

圈养的野马 发表于 2020-10-29 18:12
小白还写不出来链表 ,请朋友不吝赐教

你把它想复杂了,就是串在一起的 struct 用指针连起来

这样用的的好处是不会像数组排,需要移动数组

麻烦的是,可能需要一个指针来记录最小的一个,

不记录的话,最后需要一个递归调用的输出

csq463276932 发表于 2020-10-30 10:23:23

本帖最后由 csq463276932 于 2020-10-30 10:35 编辑

楼主位的程序应该有问题。
   for(i = 0;i < n; i++)
   {
      for(j = 0;j < n-i;j++)
      {
            if(numbers < numbers)
            {
                swap(&numbers,&numbers);
            }
      }
    }
__________________________________________
要改成下面这样才能正确输出数据。
   for(i = 0;i < n; i++)
   {
      for(j = 0;j < n-1-i;j++)
      {
            if(numbers < numbers)
            {
                swap(&numbers,&numbers);
            }
      }
    }

csq463276932 发表于 2020-10-30 17:13:44

    for(i = 0; i < n; i++)
    {
      for(j =i+1; j < n; j++)
      {
          if(numbers <numbers)   
            {
                swap(&numbers, &numbers);
            }
      }
    }

圈养的野马 发表于 2020-11-2 11:23:02

csq463276932 发表于 2020-10-30 10:23
楼主位的程序应该有问题。
   for(i = 0;i < n; i++)
   {


{:handshake:} 对,用你写的这两个确实能行,看来不是算法的问题呢,这个先把小的往后挪

圈养的野马 发表于 2020-11-2 11:27:16

csq463276932 发表于 2020-10-30 17:13
for(i = 0; i < n; i++)
    {
      for(j =i+1; j < n; j++)


这个是先把大的往前面挪

圈养的野马 发表于 2020-11-2 11:28:35

zyqcome 发表于 2020-10-30 08:54
你把它想复杂了,就是串在一起的 struct 用指针连起来

这样用的的好处是不会像数组排,需要移动数组


哦   那我后面把指针链表再学习一下回来在研究研究{:handshake:}
页: [1]
查看完整版本: c语言,如何优化程序运行时间