搜索
熱搜: 活動 交友 discuz
查看: 1412|回復: 0
打印 上一主題 下一主題

[教學] 內部搜尋法

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-13 02:15:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下的程式包含四種內部搜尋法:Bubble Sort、Selection Sort、Insertion Sort、Quick Sort

程式開始會先以亂數產生十萬個數字
( #define _mexlen 100000 )
並讓使用者選擇排序使用的搜尋法

另外
因數字過多
排序的結果沒有印出
但是可以自己把 out(copy) 前面的註解拿掉

排序時
程式會自動紀錄系統時間
在排序後顯示花掉的時間
方便大家比較各種排序法的快慢

語言:C 語言
編譯器: DevC++ 4.9.9.2
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>

  4. #define _maxlen 100000

  5. void out(int* in){
  6.   int a;
  7.   for(a=0;a<_maxlen;a++){
  8.     printf("%4d",in[a]);
  9.     if(a%19==18)
  10.       printf("\n");
  11.   }
  12. }

  13. void selectionSort(int* in){
  14.   int a=0,b=0,min=0,tmp=0;;
  15.   for(a=0;a<_maxlen;a++){
  16.     for(b=a;b<_maxlen;b++){
  17.       if(in[b]<in[min])
  18.         min = b;
  19.     }
  20.     tmp = in[a];
  21.     in[a] = in[min];
  22.     in[min] = tmp;
  23.   }
  24. }


  25. void insertionSort(int* in)
  26. {
  27.   int first=0,last=_maxlen-1;
  28.   int i,j,a;
  29.   int temp;
  30.   for (i = first+1; i<=last;i++){
  31.   temp = in[i];
  32.     j=i-1;
  33.     while((j>=first) && (in[j] > temp)){
  34.       in[j+1] = in[j];
  35.       j--;
  36.     }
  37.     in[j+1] = temp;     
  38.   }
  39. }


  40. void bubbleSort(int* in){
  41.   int a=0,b=0,tmp=0;
  42.   for(a=0;a<_maxlen;a++){
  43.     for(b=0;b<_maxlen-1;b++){
  44.       if(in[b]>in[b+1]){
  45.         tmp = in[b];
  46.         in[b] = in[b+1];
  47.         in[b+1] = tmp;
  48.       }
  49.     }
  50.   }
  51. }

  52. void swap(int *a, int *b)
  53. {
  54. int t=*a; *a=*b; *b=t;
  55. }

  56. void quickSort(int number[], int left, int right) {
  57.   int i, j, s;

  58.   if(left < right) {
  59.     s = number[left];
  60.     i = left;
  61.     j = right + 1;

  62.     while(1) {
  63.         // &brvbar;V&yen;k§&auml;
  64.         while(i + 1 < _maxlen && number[++i] < s) ;
  65.         // &brvbar;V&yen;&ordf;§&auml;
  66.         while(j -1 > -1 && number[--j] > s) ;
  67.         if(i >= j)
  68.           break;
  69.         swap(&number[i], &number[j]);
  70.     }

  71.     number[left] = number[j];
  72.     number[j] = s;

  73.     quickSort(number, left, j-1);
  74.     quickSort(number, j+1, right);
  75.   }
  76. }


  77. int main(){
  78.   int array[_maxlen];
  79.   int copy[_maxlen];
  80.   int a=0,b=0;
  81.   int selection=0;
  82.   int run=1;
  83.   srand(time(NULL));
  84.   clock_t start, finish;
  85.   
  86.   for(a=0;a<_maxlen;a++){
  87.     array[a]=(rand()+1)%100;
  88.     copy[a] = array[a];
  89.   }
  90.   
  91.   for(a=0;a<_maxlen;a++){
  92.     printf("%4d",array[a]);
  93.     if(a%19==18)
  94.       printf("\n");
  95.   }
  96.   
  97.   while( run==1 ){
  98.    
  99.     for(a=0;a<_maxlen;a++)
  100.       copy[a]=array[a];
  101.       
  102.     printf("\n\n(1)Selection sort\n(2)Insertion sort\n(3)Bubble sort\n(4)Quick Sort\n(5)Quit\n");
  103.     printf("\nEnter your choise:");
  104.     scanf("%d",&selection);
  105.   

  106.     switch(selection){
  107.       case 1:
  108.         start = clock();
  109.         selectionSort(copy);
  110.         finish = clock();
  111.         //out(copy);
  112.         printf("\n\n費時:%.3f\n",(double)(finish - start) / CLOCKS_PER_SEC );
  113.         break;
  114.       case 2:
  115.         start = clock();
  116.         insertionSort(copy);
  117.         finish = clock();
  118.         //out(copy);
  119.         printf("\n\n費時:%.3f\n",(double)(finish - start) / CLOCKS_PER_SEC );
  120.         break;
  121.       case 3:
  122.         start = clock();
  123.         bubbleSort(copy);
  124.         finish = clock();
  125.         //out(copy);
  126.         printf("\n\n費時:%.3f\n",(double)(finish - start) / CLOCKS_PER_SEC );
  127.         break;
  128.       case 4:
  129.         start = clock();
  130.         quickSort(copy, 0, _maxlen-1);
  131.         finish = clock();
  132.         //out(copy);
  133.         printf("\n\n費時:%.3f\n",(double)(finish - start) / CLOCKS_PER_SEC );
  134.         break;
  135.       default:
  136.         run=0;
  137.         break;
  138.     }
  139.   }
  140.   
  141.   printf("\n\n");
  142.   return 0;
  143. }


複製代碼



您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2024-4-29 07:46 , Processed in 0.016453 second(s), 16 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表