c語言選擇法排序問題,c語言 選擇法排序

2022-02-20 08:33:29 字數 5941 閱讀 1610

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;}

C語言選擇題,c語言選擇題?

第一個選擇題,當然是輸出a b的值,結果為b,而不是樓主說的前面沒有進行a b的計算就只輸出a的值!這是種稍微高階點的寫法,這樣寫也不不錯哦!第二個選擇題,考的就是一個條件表示式,它的基本構成形式為 表示式1?表示式2 表示式3,並且表示式1必須是一個可以判斷真假的語句,而你上面的所訴的表示式1當x...

c語言選擇題,求大神幫助C語言選擇題,求大神幫助

答案 baibcbbd ddbcd 順便解析一下du 1 需要考慮哪些是關zhi 鍵字 void sizeof 屬於 dao 那些是非法字元專 屬於。2 考察 屬 運算,前的j 如果為真,即不為0,後的運算不處理,所以k不變,只有j,i自加1 3 y x 12 x 10 x 12 考察條件運算子,若...

C語言選擇題求詳解,C語言選擇題一個,求詳解

c因為有 所以ptr先與 結合,所以ptr是指標。剩下的成分回 用來說明ptr是什麼指標。因為剩答下的成分是int m 是一個具有m個int型元素的陣列形式,所以ptr是一個指向具有m個整型元素的一維陣列的指標。c語言選擇題,求詳解 正確答案是a a p是字串指標,用法沒有問題 b a是字元陣列,不...