看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《kitconan (不再在乎)》之銘言: : 各位前輩好,小弟想寫一支程式是由user決定array大小和裡面的元素,並進行排列 : 程式碼如下 : #include<stdio.h> : #include<stdlib.h> : int size=0; : int *num,*ans; : int aa=0; : int ii=0; : int jj=0; : int i=0; : int j=0; : int cond=1; : int flag=0; : int n=0; : void cre_num(void); : void change(k){ ↑ 沒有給型態 : flag++; : aa=num[k-1]; : num[k-1]=num[k]; : num[k]=aa; : } : void sort(int len){ : for(i=1;i<=len;i++){ : if (num[i]<num[i-1]) { : change(i); : for(j=(i-1);j>=0;j--){ : if(num[j]<num[j-1]) change(j); : if(num[j-1]>num[j-2]) break; : } : } : } : } 這應該是插入排序法吧? 為了跟其他函式讓行為一致, 外面 的 for迴圈應改成 : for(i=1;i<=(len-1);i++) 這樣才不會存取違規, 內層迴圈因為兩個 if 都是在做交換 的事情, 一個是多餘的可以拿掉, break 也可以跟 for寫在 一塊, j 要注意不可以小於 1, 最後程式碼變成這樣 : void sort(int len){ for(i=1;i<=(len-1);i++) for(j=i;j>=1 && num[j] < num[j-1];j--) change(j); } i 為要插入項的索引, j 的初始值當然是 i, 然後一直往左 跑直到比完為止, 或是已經換到適當的位置 (大於前面那一 項) : void print_ans(int len); : void print_num(int len); : int main(){ : cre_num(); : ans=(int*)realloc(num,size*sizeof(int)); ↑realloc 重配置同樣大的記憶體是沒有效果的, 直 接 ans = num 即可 : sort(size); : printf("series is\n"); : print_num(size); : printf("\n"); : printf("answer is\n"); : print_ans(size); : printf("\n"); : printf("資料交換%d次\n",flag); free(num); : system("pause"); : return 0; : } -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢█歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (10/02 12:17)
kitconan:感謝大大的指點... T__T 程式一下變的精簡很多..嘆... 10/02 12:44
tsaiminghan:是練習嗎?如果是作業..用STL會比較快. 10/02 23:04
tsaiminghan:像是vector 10/02 23:04
tsaiminghan:加上sort,它把你要寫的功能都弄好了。 10/02 23:04
tsaiminghan:而且應該是c++本身就有的 10/02 23:05
tsaiminghan: 功能。 10/02 23:05
kitconan:是我自己練習寫的 >< 10/03 03:10