作者loveme00835 (最愛朴素妍)
看板C_and_CPP
標題Re: [問題] 有關於動態記憶體配置
時間Sat Oct 2 12:09:55 2010
※ 引述《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