1樓:匿名使用者
這個問題可以設想如果陣列就是從小到大的,會發生什麼情況:如果就是從小到大的陣列,if 語句沒用了,那麼直接執行a[ipos]=a[i], 這就會出現問題了,如果你沒 對ipos賦值,那麼程式會報錯,如果對ipos賦值,那麼該賦什麼值?毫無疑問是i,如果和i不同,那麼意味著每次迴圈a 陣列中ipos處的值都要改變為a[i],而a 就是從小到大的不需要改變,也會出問題。
再看一下你這個程式6為什麼沒了?
因為你這個陣列比較特殊,10到1遞減的,所以第1次排序是10和1對換,ipos=9;即1所在的位置。
第2次是9和2對換ipos=8;即2所在的位置
第3次是8和3對換ipos=7;即3所在的位置
第4次是7和4對換ipos=6;即4所在的位置
第5次是6和5對換ipos=5;即5所在的位置
注意在第5次排序之後已經得到從小到大的陣列了:1、2、3、4、5、6、7、8、9、10;
正常情況下後面的排序不會影響結果了。
後面的6、7、8、9、10再排序,這就和剛開始說的情況一樣了,這些本來就是從小到大的,if語句沒用了,那麼也就意味著ipos不會改變了,而上面執行到ipos=5,所以後面每次迴圈執行a[ipos]=a[i],把i 處的值賦給a[ipos],也就是賦給a[5], 而a[5]的值是6,就是說後面每次排序會把6、7、8、9、10替換6最終的結果是a[5]=10,6沒了。
所以可以看到如果當前迴圈i處a[i]就是最小值,是不需要進行替換操作的。但是如果不設定ipos=i,會導致執行a[ipos]=a[i],改變a[ipos]的值。
2樓:結構體神經
如果itemp不被賦值的話,那下面的if(a[j] 3樓:1024程式設計師 c語言經典例子之選擇法排序 c語言 選擇法排序 4樓:武珈藍許 void sa(int array,int n)int i,j,k,temp; for(i=0;i<10;i++) k=i; //儲存i的值,用k來進行迴圈排序 for(j=i+1;jif(array[j]k=j; //交換標號 temp=array[k]; //迴圈結束後,交換兩個標號下的元素的值 array[k]=array[i]; array[i]=temp; 5樓:1024程式設計師 c語言經典例子之選擇法排序 6樓:加 選擇法的演算法: 假設需要對10個數進行排序,那麼首先找出10個數裡面的最小數,並和這個10個數的第一個(下標0)交換位置,剩下9個數(這9個數都比剛才選出來那個數大),再選出這9個數中的最小的數,和第二個位置的數(下標1)交換,於是還剩8個數(這8個數都比剛才選出來的大).. 依次類推,當還剩兩個數時,選出兩個數的最小者放在第9個位置(下標8),於是就只剩下一個數了。這個數已經在最後一位(下標9),不用再選擇了。所以10個數排序,一共需要選擇9次(n個數排序就需要選擇n-1次)。 7樓:我的數學網路 以整形陣列元素為例,有陣列a[10](以c語言為例描述),即a[0],a[1],…,a[8],a[9](假設其元素均互不相同)。要求對其元素排序使之遞增有序。 首先以一個元素為基準,從一個方向開始掃描,比如從左至右掃描,以a[0]為基準。 接下來從a[1],…,a[9]中找出最小的元素,將其與a[0]交換。 然後將基準位置右移一位,重複上面的動作,比如,以a[1]為基準,找出a[1]~a[9]中最小的,將其與a[1]交換。 一直進行到基準位置移到陣列最後一個元素時排序結束(此時基準左邊所有元素均遞增有序,而基準為最後一個元素,故完成排序)。 以下為一個用c描述的函式實現上述排序: void sort(int array,int n) //for if(k!=i) }} 8樓: #include #define n 6 void main() ,i,j,t; for(i=0;i for(j=i+1;j if(a[i]
for(i=0;i<=n-1;i++) printf("%d",a[i]);} 9樓:匿名使用者 就是比較大小後交換位置啊 c語言選擇法排序 10樓:大野瘦子 #include #define m 5 void main() int b[m],i,j,t,k; for(i=0;iscanf("%d",&b[i]); for(i=0;ifor(k=i,j=i+1;jif(b[k]k=j; if(i!=k) t=b[i]; b[i]=b[k]; b[k]=t; for(i=0;iprintf("%d ",b[i]); 錯在大括號位置加錯了。 c語言選擇排序詳解 工作原理是每一次從無序組的資料元素中選出最小(或最大)的一個元素,存放在無序組的起始位置,無序組元素減少,有序組元素增加,直到全部待排序的資料元素排完。 以升序為例的**: **:#include void selectionsort(int *num,int n) int i = 0; int min = 0; int j = 0; int tmp = 0; for(i = 0;i < n-1;i++) min = i;//每次講min置成無序組起始位置元素下標 for(j = i;j < n;j++)//遍歷無序組,找到最小元素。 if(num[min]>num[j]) min = j; if(min != i)//如果最小元素不是無序組起始位置元素,則與起始元素交換位置 tmp = num[min]; num[min] = num[i]; num[i] = tmp; (此處空一行) int main() int num[6] = ; int i = 0; selectionsort(num,6);//這裡需要將數列元素個數傳入。有心者可用sizeof在函式內求得元素個數。 for(i = 0;i < 6;i++) printf("%d ",num[i]); return 0; 11樓: 排序如下: void selectsort(recordtype r, int length) /*對記錄陣列r做簡單選擇排序,length為待排序記錄的個數*/ }}初始序列: 第1趟:12與49交換:12 第2趟:27不動 :12 27 第3趟:65與38交換:12 27 38 第4趟:97與49交換:12 27 38 49 第5趟:76與65交換:12 27 38 49 65 第6趟:97與76交換:12 27 38 49 65 76 97 完成 選擇排序法 是對 定位比較交換法(也就是氣泡排序法) 的一種改進。選擇排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。 基於此思想的演算法主要有簡單選擇排序、樹型選擇排序和堆排序。 簡單選擇排序的基本思想:第1趟,在待排序記錄r[1]~r[n]中選出最小的記錄,將它與r[1]交換;第2趟,在待排序記錄r[2]~r[n]中選出最小的記錄,將它與r[2]交換;以此類推,第i趟在待排序記錄r[i]~r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。 拓展資料 下面也寫個例子: 由大到小時: int main(void) /* t 發放獎品* / } for( i = 0; i < 10; i ++) printf("%4d",a[ i ]); /*顯示排序後的結果*/ return 0;} 由小到大時: int main(void)/* t 發放獎品*/ } for( i = 0; i<= 9; i ++) printf("%4d",a[ i ]); /*顯示排序後的結果*/return 0;} 12樓:1024程式設計師 c語言經典例子之選擇法排序 13樓:匿名使用者 #include #include #define m 5 int main() {int b[m],i,j,t,k; for(i=0;i 14樓:匿名使用者 缺乏原始檔的宣告在第一行加, #include 15樓:匿名使用者 #define m 5 void main()// end if } // end the second floor}//end the first floor}//end main c語言選擇法排序演算法問題。 16樓:u無力哀嘆丶 迴圈開始 遍歷陣列 選擇j(j初始為0)個元素 賦值p=j 迴圈判斷i( j+1到n內)比最小的數 即巢狀迴圈一旦發現a[p]>a[i]則p=i保持p一直是最小值 內層迴圈結束後可得整個陣列前(n-j)個元素中的最小值a[p] 並把該元素a[p]與a[j]值互換 得到的a[j]為陣列前(n-j)最小值 下一次迴圈時j= j+1 剔除了前j個數(已經按從小到大排序好了)進行找最小值然後放在a[j]出 如此迴圈下去當外層迴圈結束後陣列也就完成了排序 整體思想是第一次迴圈找到整個陣列最小的數 與第一個元素互換 從而使第一個元素最小 第二次迴圈的時候排除第一個數進行上述操作 把他放在第二個元素 迴圈如此完成排序 17樓:adc吼吼最強 sum=sum+1 後面這個是初始值是0,前面那個是算出來的新值,下一個就是sum=sum+2,這時候的sum的初始值是1,新值就是1+2,sum就等於3,以此類推 c語言程式設計題:用選擇法對10個整數排序 18樓:凌亂心扉 #include int main() ;printf("排序前的序列為:\n"); for(i=0;i<10;i++)//輸出排序前的序列printf("\n"); for(i=0;i<9;i++) if(min!=i)//說明第一個數不是最小數,所以將a[i+1]~a[10]中最小值與a對換 }printf("排序後的序列為:\n"); for(i=0;i<10;i++)//輸出排序後的序列printf("%5d",a); printf("\n"); return 0;} 19樓:愛文兒童節 #include using namespace std; //#include int main() cout< for (i=1;i<=10;i++) // 輸出已排好序的10個數 cout<
cout< return 0;} 第一個選擇題,當然是輸出a b的值,結果為b,而不是樓主說的前面沒有進行a b的計算就只輸出a的值!這是種稍微高階點的寫法,這樣寫也不不錯哦!第二個選擇題,考的就是一個條件表示式,它的基本構成形式為 表示式1?表示式2 表示式3,並且表示式1必須是一個可以判斷真假的語句,而你上面的所訴的表示式1當x... 答案 baibcbbd ddbcd 順便解析一下du 1 需要考慮哪些是關zhi 鍵字 void sizeof 屬於 dao 那些是非法字元專 屬於。2 考察 屬 運算,前的j 如果為真,即不為0,後的運算不處理,所以k不變,只有j,i自加1 3 y x 12 x 10 x 12 考察條件運算子,若... c因為有 所以ptr先與 結合,所以ptr是指標。剩下的成分回 用來說明ptr是什麼指標。因為剩答下的成分是int m 是一個具有m個int型元素的陣列形式,所以ptr是一個指向具有m個整型元素的一維陣列的指標。c語言選擇題,求詳解 正確答案是a a p是字串指標,用法沒有問題 b a是字元陣列,不...C語言選擇題,c語言選擇題?
c語言選擇題,求大神幫助C語言選擇題,求大神幫助
C語言選擇題求詳解,C語言選擇題一個,求詳解