鱼C论坛

 找回密码
 立即注册
查看: 862|回复: 4

[已解决]C语言关于调用时间库计算排序时间的问题

[复制链接]
发表于 2019-12-25 16:46:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <time.h>

  4. #define WIDTH 20
  5. #define MAXK 10

  6. int n=0;
  7. long num;
  8. int da[2000000];
  9. int dd[2000000];
  10. void myhead(){
  11.         printf("**     排序算法比较      **\n");
  12.         printf("===========================\n");
  13.         printf("**     1 ---冒泡排序     **\n");
  14.         printf("**     2 ---选择排序     **\n");
  15.         printf("**     3 ---直接插入排序 **\n");
  16.         printf("**     4 ---希尔排序     **\n");
  17.         printf("**     5 ---快速排序     **\n");
  18.         printf("**     6 ---堆排序       **\n");
  19.         printf("**     7 ---归并排序     **\n");
  20.         printf("**     8 ---基数排序     **\n");
  21.         printf("**     9 ---退出程序     **\n");
  22.         printf("===========================\n");
  23.         printf("\n");
  24. }

  25. void myrand(){
  26.         int i;
  27.         srand((unsigned)time(NULL)); /*随机种子*/
  28.         for(i = 0; i < n; i ++) dd[ i ] = rand();
  29. }

  30. void myinit(){
  31.         int i;
  32.         for(i = 0; i < n; i ++) da[ i ] = dd[ i ];
  33.         num=0;
  34. }

  35. inline void swap(int *a,int *b){
  36. int temp;
  37. temp=*a;
  38. *a=*b;
  39. *b=temp;
  40. num++;
  41. }
  42. void mymaopao(){
  43.         clock_t t1 = clock();
  44.         int i,j;
  45.         for(i=0;i<n-1;i++)
  46.                 for(j=n-1;j>i;j--){
  47.                         if(da[j]<da[j-1])
  48.                         swap(&da[j],&da[j-1]);
  49.                 }
  50.         clock_t t2 = clock();
  51.         long sec = (t2-t1) / CLOCKS_PER_SEC;
  52.         printf("冒泡排序所用时间:        %ld秒\n",sec);
  53.         printf("冒泡排序所用交换次数:    %ld\n",num);
  54. }

  55. void myxuanzhe(){
  56.         clock_t t1 = clock();
  57.         int i,j,temp;
  58.         for(i=0;i<n-1;i++){
  59.                 temp=i;
  60.                 for(j=i+1;j<n;j++){
  61.                         if(da[j]<da[temp]){temp=j;num++;}
  62.                 }
  63.                 if(temp!=i)swap(&da[temp],&da[i]);
  64.         }
  65.         clock_t t2 = clock();
  66.         long sec = (t2-t1) / CLOCKS_PER_SEC;
  67.         printf("选择排序所用时间:        %ld秒\n",sec);
  68.         printf("选择排序所用交换次数:    %ld\n",num);
  69. }

  70. void mycharu(){
  71.         clock_t t1 = clock();
  72.         int i,j;
  73.         int temp=0;
  74.         for(i = 1; i < n ; i++){
  75.                 temp = da[i];
  76.                 for(j = i; j > 0&& temp < da[j - 1]; j--){
  77.                         if(temp < da[j - 1])
  78.                                 swap(&da[j],&da[j-1]);
  79.                 }
  80.                 da[j] = temp;
  81.         }       
  82.         clock_t t2 = clock();
  83.         long sec = (t2-t1) / CLOCKS_PER_SEC;
  84.         printf("插入排序所用时间:        %ld秒\n",sec);
  85.         printf("插入排序所用交换次数:    %ld\n",num);
  86. }

  87. void myxier(){
  88.         clock_t t1 = clock();
  89.         int i, j, k;
  90.         int temp, gap;  
  91.         for (gap = n / 2; gap > 0; gap /= 2){
  92.                 for (i = 0; i < gap; i++){
  93.                         for (j = i + gap; j < n; j += gap)
  94.                                 if (da[j] < da[j - gap]){
  95.                                         temp = da[j];  
  96.                                         k = j - gap;
  97.                                         while (k >= 0 && da[k] > temp){
  98.                                                 da[k + gap] = da[k];
  99.                                                 k -= gap;
  100.                                         }
  101.                                         da[k + gap] = temp;
  102.                                         num++;
  103.                                 }
  104.                 }
  105.         }
  106.         clock_t t2 = clock();
  107.         long sec = (t2-t1) / CLOCKS_PER_SEC;
  108.         printf("希尔排序所用时间:        %ld秒\n",sec);
  109.         printf("希尔排序所用交换次数:    %ld\n",num);
  110. }

  111. void myqsort(int l,int r) {
  112.         int i, j, x;
  113.         if (l < r){
  114.                 i = l;
  115.                 j = r;
  116.                 x = da[i];
  117.                 while (i < j){
  118.                         while(i < j && da[j] > x) j--;
  119.                         if(i < j) da[i++] = da[j];
  120.                         while(i < j && da[i] < x) i++;
  121.                         if(i < j) da[j--] = da[i];
  122.                 }
  123.                 da[i] = x;
  124.                 num++;
  125.                 myqsort(l, i-1);
  126.                 myqsort(i+1, r);
  127.         }
  128. }
  129. void mykuaisu(){
  130.         clock_t t1 = clock();
  131.         myqsort(0,n);       
  132.         clock_t t2 = clock();
  133.         long sec = (t2-t1) / CLOCKS_PER_SEC;
  134.         printf("希尔排序所用时间:        %ld秒\n",sec);
  135.         printf("希尔排序所用交换次数:    %ld\n",num);
  136. }
  137. void HeapAdjust(int i, int nLength){
  138.         int nChild, nTemp;
  139.         for (nTemp = da[i]; 2 * i + 1 < nLength; i = nChild){
  140.                 nChild = 2 * i + 1;
  141.                 if (nChild != nLength - 1 && da[nChild + 1] > da[nChild])
  142.                     ++nChild;
  143.                 if (nTemp < da[nChild]){
  144.                         da[i] = da[nChild];
  145.                         num++;
  146.                 }else{
  147.                         break;
  148.                 }
  149.         }
  150.         da[i] = nTemp;
  151. }
  152. void mydui(){
  153.         clock_t t1 = clock();
  154.         int i;
  155.         for (i = n / 2 - 1; i >= 0; --i){
  156.                 HeapAdjust(i, n);
  157.         }
  158.         for (i = n - 1; i > 0; --i){
  159.                 swap(&da[0], &da[i]);
  160.         HeapAdjust(0, i);
  161.         }
  162.         clock_t t2 = clock();
  163.         long sec = (t2-t1) / CLOCKS_PER_SEC;
  164.         printf("堆排序所用时间:        %ld秒\n",sec);
  165.         printf("堆排序所用交换次数:    %ld\n",num);
  166. }
  167. void Merge(int left, int m, int right){
  168.         int aux[200000] = {0};
  169.             int i;
  170.             int j;
  171.             int k;
  172.    
  173.             for (i = left, j = m+1, k = 0; k <= right-left; k++){
  174.                 num++;
  175.                 if (i == m+1){
  176.                             aux[k] = da[j++];
  177.                            continue;
  178.                 }
  179.                 if (j == right+1){
  180.                             aux[k] = da[i++];
  181.                             continue;
  182.                 }
  183.                 if (da[i] < da[j]){
  184.                             aux[k] = da[i++];
  185.                 }else{
  186.                             aux[k] = da[j++];
  187.                 }
  188.             }
  189.         for (i = left, j = 0; i <= right; i++, j++){
  190.                 da[i] = aux[j];
  191.         }
  192. }
  193. void MergeSort(int start,int end){
  194.         if (start < end){
  195.                 int i;
  196.                 i = (end + start) / 2;
  197.                 MergeSort(start, i);
  198.                 MergeSort(i + 1, end);
  199.                 Merge(start, i, end);
  200.     }
  201. }
  202. void myguibing(){
  203.         clock_t t1 = clock();
  204.         MergeSort(0,n-1);
  205.         clock_t t2 = clock();
  206.         long sec = (t2-t1) / CLOCKS_PER_SEC;
  207.         printf("归并排序所用时间:        %ld秒\n",sec);
  208.         printf("归并排序所用交换次数:    %ld\n",num);
  209. }
  210. int getDValue(int value, int d) {
  211.         for (;d > 0 && value > 0; d--) {
  212.                 value = value / MAXK;
  213.         }
  214.         return value % MAXK;
  215. }
  216. void myjishu(){
  217.         clock_t t1 = clock();
  218.         int i;
  219.         void innerCountingSort(int d);
  220.         for (i = 0; i < WIDTH; i++) {
  221.                 innerCountingSort(i);
  222.         }
  223.         clock_t t2 = clock();
  224.         long sec = (t2-t1) / CLOCKS_PER_SEC;
  225.         printf("基数排序所用时间:        %ld秒\n",sec);
  226.         printf("基数排序所用交换次数:    %ld\n",num);
  227. }

  228. void innerCountingSort(int d) {
  229.         int i, j, x, k[MAXK] = {0};
  230.         int *ip = (int *)malloc(n * sizeof(int));
  231.         int *bp = (int *)malloc(n * sizeof(int));
  232.         int getDValue(int value, int d);
  233.         for (i = 0; i < n; i++) {
  234.                 ip[i] = getDValue(da[i], d);
  235.                 k[ip[i]]++;
  236.         }

  237.         for (j = 1; j < MAXK; j++) {
  238.                 k[j] = k[j] + k[j-1];
  239.         }

  240.         for (i = n - 1; i >= 0; i--) {
  241.                 bp[k[ip[i]] - 1] = da[i];
  242.                 k[ip[i]]--;
  243.         }

  244.         for (i = 0; i < n; i++) {
  245.                 da[i] = bp[i];
  246.         }

  247.         free(ip);
  248.         free(bp);
  249. }


  250. int main()
  251. {
  252.         myhead();
  253.         printf("请输入要产生的随机数的个数(不超过10000):");
  254.         scanf("%d",&n);
  255.         myrand(n);
  256.         printf("\n");
  257.         int flag = 1;
  258.         while (flag){       
  259.                 myinit();       
  260.                 printf("\n");       
  261.                 printf("请选择排序算法:");
  262.                 int ch;
  263.                 scanf("%d", &ch);
  264.                 switch(ch){
  265.                         case 1 : mymaopao(); break;
  266.                         case 2 : myxuanzhe(); break;
  267.                         case 3 : mycharu(); break;
  268.                         case 4 : myxier(); break;
  269.                         case 5 : mykuaisu(); break;
  270.                         case 6 : mydui(); break;
  271.                         case 7 : myguibing(); break;
  272.                         case 8 : myjishu(); break;
  273.                         case 9 : flag = 0;       
  274.                 }
  275.         }
  276.         return 0;
  277. }
复制代码




有一个问题就是,每个排序算法算出来的时间都是0,不知道哪里出错了,
希望有大神能够帮忙看看,感谢!
最佳答案
2019-12-25 17:37:10
刚刚看了一下你的程序。先说你提出的问题。问题应该是出在这句程序上了
long sec = (t2-t1) / CLOCKS_PER_SEC;
这里是因为t1和t2差距太小,排序时间不足一秒,整数除法结果当然是零啦。应该把sec改为float,最好是double,另外(t2-t1) 进行强制类型转换。double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
修改之后,printf中也应该修改。

此外你的程序还有一个错误。第二个函数myrand(),在定义的时候没有参数,调用的时候有个参数int。
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <time.h>

  4. #define WIDTH 20
  5. #define MAXK 10

  6. int n=0;
  7. long num;
  8. int da[2000000];
  9. int dd[2000000];
  10. void myhead(){
  11.         printf("**     排序算法比较      **\n");
  12.         printf("===========================\n");
  13.         printf("**     1 ---冒泡排序     **\n");
  14.         printf("**     2 ---选择排序     **\n");
  15.         printf("**     3 ---直接插入排序 **\n");
  16.         printf("**     4 ---希尔排序     **\n");
  17.         printf("**     5 ---快速排序     **\n");
  18.         printf("**     6 ---堆排序       **\n");
  19.         printf("**     7 ---归并排序     **\n");
  20.         printf("**     8 ---基数排序     **\n");
  21.         printf("**     9 ---退出程序     **\n");
  22.         printf("===========================\n");
  23.         printf("\n");
  24. }

  25. void myrand(int i){
  26.         //int i;
  27.         srand((unsigned)time(NULL)); /*随机种子*/
  28.         for(i = 0; i < n; i ++) dd[ i ] = rand();
  29. }

  30. void myinit(){
  31.         int i;
  32.         for(i = 0; i < n; i ++) da[ i ] = dd[ i ];
  33.         num=0;
  34. }

  35. inline void swap(int *a,int *b){
  36. int temp;
  37. temp=*a;
  38. *a=*b;
  39. *b=temp;
  40. num++;
  41. }
  42. void mymaopao(){
  43.         clock_t t1 = clock();
  44.         int i,j;
  45.         for(i=0;i<n-1;i++)
  46.                 for(j=n-1;j>i;j--){
  47.                         if(da[j]<da[j-1])
  48.                         swap(&da[j],&da[j-1]);
  49.                 }
  50.         clock_t t2 = clock();
  51.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  52.         printf("冒泡排序所用时间:        %f秒\n",sec);
  53.         printf("冒泡排序所用交换次数:    %ld\n",num);
  54. }

  55. void myxuanzhe(){
  56.         clock_t t1 = clock();
  57.         int i,j,temp;
  58.         for(i=0;i<n-1;i++){
  59.                 temp=i;
  60.                 for(j=i+1;j<n;j++){
  61.                         if(da[j]<da[temp]){temp=j;num++;}
  62.                 }
  63.                 if(temp!=i)swap(&da[temp],&da[i]);
  64.         }
  65.         clock_t t2 = clock();
  66.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  67.         printf("选择排序所用时间:        %f秒\n",sec);
  68.         printf("选择排序所用交换次数:    %ld\n",num);
  69. }

  70. void mycharu(){
  71.         clock_t t1 = clock();
  72.         int i,j;
  73.         int temp=0;
  74.         for(i = 1; i < n ; i++){
  75.                 temp = da[i];
  76.                 for(j = i; j > 0&& temp < da[j - 1]; j--){
  77.                         if(temp < da[j - 1])
  78.                                 swap(&da[j],&da[j-1]);
  79.                 }
  80.                 da[j] = temp;
  81.         }        
  82.         clock_t t2 = clock();
  83.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  84.         printf("插入排序所用时间:        %f秒\n",sec);
  85.         printf("插入排序所用交换次数:    %ld\n",num);
  86. }

  87. void myxier(){
  88.         clock_t t1 = clock();
  89.         int i, j, k;
  90.         int temp, gap;  
  91.         for (gap = n / 2; gap > 0; gap /= 2){
  92.                 for (i = 0; i < gap; i++){
  93.                         for (j = i + gap; j < n; j += gap)
  94.                                 if (da[j] < da[j - gap]){
  95.                                         temp = da[j];  
  96.                                         k = j - gap;
  97.                                         while (k >= 0 && da[k] > temp){
  98.                                                 da[k + gap] = da[k];
  99.                                                 k -= gap;
  100.                                         }
  101.                                         da[k + gap] = temp;
  102.                                         num++;
  103.                                 }
  104.                 }
  105.         }
  106.         clock_t t2 = clock();
  107.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  108.         printf("希尔排序所用时间:        %f秒\n",sec);
  109.         printf("希尔排序所用交换次数:    %ld\n",num);
  110. }

  111. void myqsort(int l,int r) {
  112.         int i, j, x;
  113.         if (l < r){
  114.                 i = l;
  115.                 j = r;
  116.                 x = da[i];
  117.                 while (i < j){
  118.                         while(i < j && da[j] > x) j--;
  119.                         if(i < j) da[i++] = da[j];
  120.                         while(i < j && da[i] < x) i++;
  121.                         if(i < j) da[j--] = da[i];
  122.                 }
  123.                 da[i] = x;
  124.                 num++;
  125.                 myqsort(l, i-1);
  126.                 myqsort(i+1, r);
  127.         }
  128. }
  129. void mykuaisu(){
  130.         clock_t t1 = clock();
  131.         myqsort(0,n);        
  132.         clock_t t2 = clock();
  133.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  134.         printf("希尔排序所用时间:        %f秒\n",sec);
  135.         printf("希尔排序所用交换次数:    %ld\n",num);
  136. }
  137. void HeapAdjust(int i, int nLength){
  138.         int nChild, nTemp;
  139.         for (nTemp = da[i]; 2 * i + 1 < nLength; i = nChild){
  140.                 nChild = 2 * i + 1;
  141.                 if (nChild != nLength - 1 && da[nChild + 1] > da[nChild])
  142.                     ++nChild;
  143.                 if (nTemp < da[nChild]){
  144.                         da[i] = da[nChild];
  145.                         num++;
  146.                 }else{
  147.                         break;
  148.                 }
  149.         }
  150.         da[i] = nTemp;
  151. }
  152. void mydui(){
  153.         clock_t t1 = clock();
  154.         int i;
  155.         for (i = n / 2 - 1; i >= 0; --i){
  156.                 HeapAdjust(i, n);
  157.         }
  158.         for (i = n - 1; i > 0; --i){
  159.                 swap(&da[0], &da[i]);
  160.         HeapAdjust(0, i);
  161.         }
  162.         clock_t t2 = clock();
  163.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  164.         printf("堆排序所用时间:        %f秒\n",sec);
  165.         printf("堆排序所用交换次数:    %ld\n",num);
  166. }
  167. void Merge(int left, int m, int right){
  168.         int aux[200000] = {0};
  169.             int i;
  170.             int j;
  171.             int k;
  172.    
  173.             for (i = left, j = m+1, k = 0; k <= right-left; k++){
  174.                 num++;
  175.                 if (i == m+1){
  176.                             aux[k] = da[j++];
  177.                            continue;
  178.                 }
  179.                 if (j == right+1){
  180.                             aux[k] = da[i++];
  181.                             continue;
  182.                 }
  183.                 if (da[i] < da[j]){
  184.                             aux[k] = da[i++];
  185.                 }else{
  186.                             aux[k] = da[j++];
  187.                 }
  188.             }
  189.         for (i = left, j = 0; i <= right; i++, j++){
  190.                 da[i] = aux[j];
  191.         }
  192. }
  193. void MergeSort(int start,int end){
  194.         if (start < end){
  195.                 int i;
  196.                 i = (end + start) / 2;
  197.                 MergeSort(start, i);
  198.                 MergeSort(i + 1, end);
  199.                 Merge(start, i, end);
  200.     }
  201. }
  202. void myguibing(){
  203.         clock_t t1 = clock();
  204.         MergeSort(0,n-1);
  205.         clock_t t2 = clock();
  206.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  207.         printf("归并排序所用时间:        %f秒\n",sec);
  208.         printf("归并排序所用交换次数:    %ld\n",num);
  209. }
  210. int getDValue(int value, int d) {
  211.         for (;d > 0 && value > 0; d--) {
  212.                 value = value / MAXK;
  213.         }
  214.         return value % MAXK;
  215. }
  216. void myjishu(){
  217.         clock_t t1 = clock();
  218.         int i;
  219.         void innerCountingSort(int d);
  220.         for (i = 0; i < WIDTH; i++) {
  221.                 innerCountingSort(i);
  222.         }
  223.         clock_t t2 = clock();
  224.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  225.         printf("基数排序所用时间:        %f秒\n",sec);
  226.         printf("基数排序所用交换次数:    %ld\n",num);
  227. }

  228. void innerCountingSort(int d) {
  229.         int i, j, x, k[MAXK] = {0};
  230.         int *ip = (int *)malloc(n * sizeof(int));
  231.         int *bp = (int *)malloc(n * sizeof(int));
  232.         int getDValue(int value, int d);
  233.         for (i = 0; i < n; i++) {
  234.                 ip[i] = getDValue(da[i], d);
  235.                 k[ip[i]]++;
  236.         }

  237.         for (j = 1; j < MAXK; j++) {
  238.                 k[j] = k[j] + k[j-1];
  239.         }

  240.         for (i = n - 1; i >= 0; i--) {
  241.                 bp[k[ip[i]] - 1] = da[i];
  242.                 k[ip[i]]--;
  243.         }

  244.         for (i = 0; i < n; i++) {
  245.                 da[i] = bp[i];
  246.         }

  247.         free(ip);
  248.         free(bp);
  249. }


  250. int main()
  251. {
  252.         myhead();
  253.         printf("请输入要产生的随机数的个数(不超过10000):");
  254.         scanf("%d",&n);
  255.         myrand(n);
  256.         printf("\n");
  257.         int flag = 1;
  258.         while (flag){        
  259.                 myinit();        
  260.                 printf("\n");        
  261.                 printf("请选择排序算法:");
  262.                 int ch;
  263.                 scanf("%d", &ch);
  264.                 switch(ch){
  265.                         case 1 : mymaopao(); break;
  266.                         case 2 : myxuanzhe(); break;
  267.                         case 3 : mycharu(); break;
  268.                         case 4 : myxier(); break;
  269.                         case 5 : mykuaisu(); break;
  270.                         case 6 : mydui(); break;
  271.                         case 7 : myguibing(); break;
  272.                         case 8 : myjishu(); break;
  273.                         case 9 : flag = 0;        
  274.                 }
  275.         }
  276.         return 0;
  277. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-25 17:37:10 | 显示全部楼层    本楼为最佳答案   
刚刚看了一下你的程序。先说你提出的问题。问题应该是出在这句程序上了
long sec = (t2-t1) / CLOCKS_PER_SEC;
这里是因为t1和t2差距太小,排序时间不足一秒,整数除法结果当然是零啦。应该把sec改为float,最好是double,另外(t2-t1) 进行强制类型转换。double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
修改之后,printf中也应该修改。

此外你的程序还有一个错误。第二个函数myrand(),在定义的时候没有参数,调用的时候有个参数int。
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <time.h>

  4. #define WIDTH 20
  5. #define MAXK 10

  6. int n=0;
  7. long num;
  8. int da[2000000];
  9. int dd[2000000];
  10. void myhead(){
  11.         printf("**     排序算法比较      **\n");
  12.         printf("===========================\n");
  13.         printf("**     1 ---冒泡排序     **\n");
  14.         printf("**     2 ---选择排序     **\n");
  15.         printf("**     3 ---直接插入排序 **\n");
  16.         printf("**     4 ---希尔排序     **\n");
  17.         printf("**     5 ---快速排序     **\n");
  18.         printf("**     6 ---堆排序       **\n");
  19.         printf("**     7 ---归并排序     **\n");
  20.         printf("**     8 ---基数排序     **\n");
  21.         printf("**     9 ---退出程序     **\n");
  22.         printf("===========================\n");
  23.         printf("\n");
  24. }

  25. void myrand(int i){
  26.         //int i;
  27.         srand((unsigned)time(NULL)); /*随机种子*/
  28.         for(i = 0; i < n; i ++) dd[ i ] = rand();
  29. }

  30. void myinit(){
  31.         int i;
  32.         for(i = 0; i < n; i ++) da[ i ] = dd[ i ];
  33.         num=0;
  34. }

  35. inline void swap(int *a,int *b){
  36. int temp;
  37. temp=*a;
  38. *a=*b;
  39. *b=temp;
  40. num++;
  41. }
  42. void mymaopao(){
  43.         clock_t t1 = clock();
  44.         int i,j;
  45.         for(i=0;i<n-1;i++)
  46.                 for(j=n-1;j>i;j--){
  47.                         if(da[j]<da[j-1])
  48.                         swap(&da[j],&da[j-1]);
  49.                 }
  50.         clock_t t2 = clock();
  51.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  52.         printf("冒泡排序所用时间:        %f秒\n",sec);
  53.         printf("冒泡排序所用交换次数:    %ld\n",num);
  54. }

  55. void myxuanzhe(){
  56.         clock_t t1 = clock();
  57.         int i,j,temp;
  58.         for(i=0;i<n-1;i++){
  59.                 temp=i;
  60.                 for(j=i+1;j<n;j++){
  61.                         if(da[j]<da[temp]){temp=j;num++;}
  62.                 }
  63.                 if(temp!=i)swap(&da[temp],&da[i]);
  64.         }
  65.         clock_t t2 = clock();
  66.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  67.         printf("选择排序所用时间:        %f秒\n",sec);
  68.         printf("选择排序所用交换次数:    %ld\n",num);
  69. }

  70. void mycharu(){
  71.         clock_t t1 = clock();
  72.         int i,j;
  73.         int temp=0;
  74.         for(i = 1; i < n ; i++){
  75.                 temp = da[i];
  76.                 for(j = i; j > 0&& temp < da[j - 1]; j--){
  77.                         if(temp < da[j - 1])
  78.                                 swap(&da[j],&da[j-1]);
  79.                 }
  80.                 da[j] = temp;
  81.         }        
  82.         clock_t t2 = clock();
  83.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  84.         printf("插入排序所用时间:        %f秒\n",sec);
  85.         printf("插入排序所用交换次数:    %ld\n",num);
  86. }

  87. void myxier(){
  88.         clock_t t1 = clock();
  89.         int i, j, k;
  90.         int temp, gap;  
  91.         for (gap = n / 2; gap > 0; gap /= 2){
  92.                 for (i = 0; i < gap; i++){
  93.                         for (j = i + gap; j < n; j += gap)
  94.                                 if (da[j] < da[j - gap]){
  95.                                         temp = da[j];  
  96.                                         k = j - gap;
  97.                                         while (k >= 0 && da[k] > temp){
  98.                                                 da[k + gap] = da[k];
  99.                                                 k -= gap;
  100.                                         }
  101.                                         da[k + gap] = temp;
  102.                                         num++;
  103.                                 }
  104.                 }
  105.         }
  106.         clock_t t2 = clock();
  107.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  108.         printf("希尔排序所用时间:        %f秒\n",sec);
  109.         printf("希尔排序所用交换次数:    %ld\n",num);
  110. }

  111. void myqsort(int l,int r) {
  112.         int i, j, x;
  113.         if (l < r){
  114.                 i = l;
  115.                 j = r;
  116.                 x = da[i];
  117.                 while (i < j){
  118.                         while(i < j && da[j] > x) j--;
  119.                         if(i < j) da[i++] = da[j];
  120.                         while(i < j && da[i] < x) i++;
  121.                         if(i < j) da[j--] = da[i];
  122.                 }
  123.                 da[i] = x;
  124.                 num++;
  125.                 myqsort(l, i-1);
  126.                 myqsort(i+1, r);
  127.         }
  128. }
  129. void mykuaisu(){
  130.         clock_t t1 = clock();
  131.         myqsort(0,n);        
  132.         clock_t t2 = clock();
  133.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  134.         printf("希尔排序所用时间:        %f秒\n",sec);
  135.         printf("希尔排序所用交换次数:    %ld\n",num);
  136. }
  137. void HeapAdjust(int i, int nLength){
  138.         int nChild, nTemp;
  139.         for (nTemp = da[i]; 2 * i + 1 < nLength; i = nChild){
  140.                 nChild = 2 * i + 1;
  141.                 if (nChild != nLength - 1 && da[nChild + 1] > da[nChild])
  142.                     ++nChild;
  143.                 if (nTemp < da[nChild]){
  144.                         da[i] = da[nChild];
  145.                         num++;
  146.                 }else{
  147.                         break;
  148.                 }
  149.         }
  150.         da[i] = nTemp;
  151. }
  152. void mydui(){
  153.         clock_t t1 = clock();
  154.         int i;
  155.         for (i = n / 2 - 1; i >= 0; --i){
  156.                 HeapAdjust(i, n);
  157.         }
  158.         for (i = n - 1; i > 0; --i){
  159.                 swap(&da[0], &da[i]);
  160.         HeapAdjust(0, i);
  161.         }
  162.         clock_t t2 = clock();
  163.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  164.         printf("堆排序所用时间:        %f秒\n",sec);
  165.         printf("堆排序所用交换次数:    %ld\n",num);
  166. }
  167. void Merge(int left, int m, int right){
  168.         int aux[200000] = {0};
  169.             int i;
  170.             int j;
  171.             int k;
  172.    
  173.             for (i = left, j = m+1, k = 0; k <= right-left; k++){
  174.                 num++;
  175.                 if (i == m+1){
  176.                             aux[k] = da[j++];
  177.                            continue;
  178.                 }
  179.                 if (j == right+1){
  180.                             aux[k] = da[i++];
  181.                             continue;
  182.                 }
  183.                 if (da[i] < da[j]){
  184.                             aux[k] = da[i++];
  185.                 }else{
  186.                             aux[k] = da[j++];
  187.                 }
  188.             }
  189.         for (i = left, j = 0; i <= right; i++, j++){
  190.                 da[i] = aux[j];
  191.         }
  192. }
  193. void MergeSort(int start,int end){
  194.         if (start < end){
  195.                 int i;
  196.                 i = (end + start) / 2;
  197.                 MergeSort(start, i);
  198.                 MergeSort(i + 1, end);
  199.                 Merge(start, i, end);
  200.     }
  201. }
  202. void myguibing(){
  203.         clock_t t1 = clock();
  204.         MergeSort(0,n-1);
  205.         clock_t t2 = clock();
  206.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  207.         printf("归并排序所用时间:        %f秒\n",sec);
  208.         printf("归并排序所用交换次数:    %ld\n",num);
  209. }
  210. int getDValue(int value, int d) {
  211.         for (;d > 0 && value > 0; d--) {
  212.                 value = value / MAXK;
  213.         }
  214.         return value % MAXK;
  215. }
  216. void myjishu(){
  217.         clock_t t1 = clock();
  218.         int i;
  219.         void innerCountingSort(int d);
  220.         for (i = 0; i < WIDTH; i++) {
  221.                 innerCountingSort(i);
  222.         }
  223.         clock_t t2 = clock();
  224.         double sec = (double)(t2-t1) / CLOCKS_PER_SEC;
  225.         printf("基数排序所用时间:        %f秒\n",sec);
  226.         printf("基数排序所用交换次数:    %ld\n",num);
  227. }

  228. void innerCountingSort(int d) {
  229.         int i, j, x, k[MAXK] = {0};
  230.         int *ip = (int *)malloc(n * sizeof(int));
  231.         int *bp = (int *)malloc(n * sizeof(int));
  232.         int getDValue(int value, int d);
  233.         for (i = 0; i < n; i++) {
  234.                 ip[i] = getDValue(da[i], d);
  235.                 k[ip[i]]++;
  236.         }

  237.         for (j = 1; j < MAXK; j++) {
  238.                 k[j] = k[j] + k[j-1];
  239.         }

  240.         for (i = n - 1; i >= 0; i--) {
  241.                 bp[k[ip[i]] - 1] = da[i];
  242.                 k[ip[i]]--;
  243.         }

  244.         for (i = 0; i < n; i++) {
  245.                 da[i] = bp[i];
  246.         }

  247.         free(ip);
  248.         free(bp);
  249. }


  250. int main()
  251. {
  252.         myhead();
  253.         printf("请输入要产生的随机数的个数(不超过10000):");
  254.         scanf("%d",&n);
  255.         myrand(n);
  256.         printf("\n");
  257.         int flag = 1;
  258.         while (flag){        
  259.                 myinit();        
  260.                 printf("\n");        
  261.                 printf("请选择排序算法:");
  262.                 int ch;
  263.                 scanf("%d", &ch);
  264.                 switch(ch){
  265.                         case 1 : mymaopao(); break;
  266.                         case 2 : myxuanzhe(); break;
  267.                         case 3 : mycharu(); break;
  268.                         case 4 : myxier(); break;
  269.                         case 5 : mykuaisu(); break;
  270.                         case 6 : mydui(); break;
  271.                         case 7 : myguibing(); break;
  272.                         case 8 : myjishu(); break;
  273.                         case 9 : flag = 0;        
  274.                 }
  275.         }
  276.         return 0;
  277. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-25 17:43:14 | 显示全部楼层
不要以秒做单位,你的电脑没有那么烂,一个不到10000长度的排序算法用不了1秒的,
用毫秒做单位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-26 19:21:44 | 显示全部楼层
sunrise085 发表于 2019-12-25 17:37
刚刚看了一下你的程序。先说你提出的问题。问题应该是出在这句程序上了
long sec = (t2-t1) / CLOCKS_PER_ ...

嗯好的!明白啦,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-26 19:22:49 | 显示全部楼层
Croper 发表于 2019-12-25 17:43
不要以秒做单位,你的电脑没有那么烂,一个不到10000长度的排序算法用不了1秒的,
用毫秒做单位

嗯嗯,明白了,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 12:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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