Ⅰ c語言如何用選擇法排序任意輸入十個數(從大到小、從小到大)
#include
<stdio.h>
main(void)
{
int
i,j,a[10],p=0,t=0,temp;
printf("請輸入原數組:\n");
for(j=0;j<10;j++)
scanf("%d",&a[j]);
temp=a[0];
for(j=0;j<9;j++)
{
t=j;
temp=a[j];
for(i=j+1;i<10;i++)
if(temp>a[i])
//這是由小到大排序
如果是大到小則改為
if(temp<a[i])
{temp=a[i];p=i;}
{temp=a[p];a[p]=a[t];a[t]=temp;}
}
printf("排序後的數組為:\n");
for(j=0;j<10;j++)
printf("%d
",a[j]);
}
Ⅱ c語言 選擇法排序
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;j<n;j++) //將第i個元素後面的元素與第i個元素進行比較
if(array[j]<array[k]) //如果第k=i個元素後面的元素小於i號元素,交換兩個元素的標號, 這樣就將最小元素的標號放到最前面
k=j; //交換標號
temp=array[k]; //循環結束後,交換兩個標號下的元素的值
array[k]=array[i];
array[i]=temp;
}
}
這個程序實現的是由小到大的排序。第二個循環裡面,就是i號元素後面最小的元素對應的標號放到k中,在交換當前元素與k號元素中的值,實現由大到小排序
Ⅲ C語言(數組排序)
1.選擇排序思想:假定按從大到小排序,比較數組中所有數的大小,挑出最大的元素將其與第一個元素交換位置,然後比較除第一個元素外其他各元素的大小,挑出最大的元素與第二個元素交換位置,依此類推,完成排序。
2.給你解釋開頭的n-2:k=0 to k=n-2,k總共取n-1個元素,當k=n-2時,對應a[n-2]為數組倒數第二個元素,此時i=n-i,a[i]即a[n-1]對應數組最後一個元素,當比較完a[n-2]和a[n-1]並排序後,整個數組就完成了排列。
3.代碼:
for(k=0;k<=n-2;k++)
{
index=k;
for(i=k+1;i<=n-1;i++)
{
if(a[i]<a[index])
{
index=i;
}
}
temp=a[k],a[k]=a[index],a[index]=temp;
}
Ⅳ C語言中的選擇排序法是什麼
選擇排序(Selection sort)是一種簡單直觀的排序演算法。工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
以下是一個實現選擇排序的例子:
#defineSWAP(x,y,t)((t)=(x),(x)=(y),(y)=(t))
//將list中的n個數據,通過選擇排序演算法排序。
voidselete_sort(intlist[],intn)
{
inti,j,min,temp;
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++)//找出最小元素的下標。
if(list[j]<list[min])
min=j;
SWAP(list[i],list[min],temp);//交換最小元素到當前起始位置。
}
}
Ⅳ C語言數組A用選擇排序
定義一個整型數組a[n],下面用五種方法對其從小到大排序。
(1)「冒泡法」
冒泡法大家都較熟悉。其原理為從a[0]開始,依次將其和後面的元素比較,若a[0]>a[i ],則交換它們,一直比較到a[n]。同理對a[1],a[2],...a[n-1]處理,即完成排序。下面列出其代碼:
void bubble(int *a,int n) /*定義兩個參數:數組首地址與數組大小*/
{
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) /*注意循環的上下限*/
if(a[i ]>a[j]) {
temp=a[i ];
a[i ]=a[j];
a[j]=temp;
}
}
冒泡法原理簡單,但其缺點是交換次數多,效率低。
下面介紹一種源自冒泡法但更有效率的方法「選擇法」。
(2)「選擇法」
選擇法循環過程與冒泡法一致,它還定義了記號k=i,然後依次把a[k]同後面元素比較,若a[k]>a[j],則使k=j.最後看看k=i是否還成立,不成立則交換a[k],a[i ],這樣就比冒泡法省下許多無用的交換,提高了效率。
void choise(int *a,int n)
{
int i,j,k,temp;
for(i=0;i<n-1;i++) {
k=i; /*給記號賦值*/
for(j=i+1;j<n;j++)
if(a[k]>a[j ]) k=j; /*是k總是指向最小元素*/
if(i!=k) { /*當k!=i是才交換,否則a[i ] 即為最小*/
temp=a[i ];
a[i ]=a[k];
a[k]=temp;
}
}
}
選擇法比冒泡法效率更高,但說到高效率,非「快速法」莫屬,現在就讓我們來了解它。
(3)「快速法」
快速法定義了三個參數,(數組首地址*a,要排序數組起始元素下標i,要排序數組結束元素下標j). 它首先選一個數組元素(一般為a[(i +j)/2],即中間元素)作為參照,把比它小 的元素放到它的左邊,比它大的放在右邊。然後運用遞歸,在將它左,右兩個子數組排序,最後完成整個數組的排序。下面分析其代碼:
void quick(int *a,int i,int j)
{
int m,n,temp;
int k;
m=i;
n=j;
k=a[(i +j)/2]; /*選取的參照*/
do {
while(a[m]<k&&m<j) m++; /* 從左到右找比k大的元素*/
while(a[n]>k&&n>i) n--; /* 從右到左找比k小的元素*/
if(m<=n) { /*若找到且滿足條件,則交換*/
temp=a[m];
a[m]=a[n];
a[n]=temp;
m++;
n--;
}
}while(m<=n);
if(m<j) quick(a,m,j); /*運用遞歸*/
if(n>i) quick(a,i,n);
}
(4)「插入法」
插入法是一種比較直觀的排序方法。它首先把數組頭兩個元素排好序,再依次把後面的元素插入適當的位置。把數組元素插完也就完成了排序。
void insert(int *a,int n)
{
int i,j,temp;
for(i=1;i<n;i++) {
temp=a[i ]; /*temp為要插入的元素*/
j=i-1;
while(j>=0&&temp<a[j]) { /*從a[i -1]開始找比a[i ]小的數,同時把數組元素向後移*/
a[j+1]=a[j ];
j--;
}
a[j+1]=temp; /*插入*/
}
}
(5)「shell法」
shell法是一個叫 shell 的美國人與1969年發明的。它首先把相距k(k>=1)的那幾個元素排好序,再縮小k值(一般取其一半),再排序,直到k=1時完成排序。下面讓我們來分析其代碼:
void shell(int *a,int n)
{
int i,j,k,x;
k=n/2; /*間距值*/
while(k>=1) {
for(i=k;i<n;i++) {
x=a[i ];
j=i-k;
while(j>=0&&x<a[j]) {
a[j+k]=a[j ];
j-=k;
}
a[j+k]=x;
}
k/=2; /*縮小間距值*/
}
}
上面我們已經對幾種排序法作了介紹,現在讓我們寫個主函數檢驗一下。
#include<stdio.h>
/*別偷懶,下面的"..."代表函數體,自己加上去哦!*/
void bubble(int *a,int n)
{
...
}
void choise(int *a,int n)
{
...
}
void quick(int *a,int i,int j)
{
...
}
void insert(int *a,int n)
{
...
}
void shell(int *a,int n)
{
...
}
/*為了列印方便,我們寫一個print吧。*/
void print(int *a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%5d",a[i ]);
printf("\n");
}
main()
{ /*為了公平,我們給每個函數定義一個相同數組*/
int a1[]={13,0,5,8,1,7,21,50,9,2};
int a2[]={13,0,5,8,1,7,21,50,9,2};
int a3[]={13,0,5,8,1,7,21,50,9,2};
int a4[]={13,0,5,8,1,7,21,50,9,2};
int a5[]={13,0,5,8,1,7,21,50,9,2};
printf("the original list:");
print(a1,10);
printf("according to bubble:");
bubble(a1,10);
print(a1,10);
printf("according to choise:");
choise(a2,10);
print(a2,10);
printf("according to quick:");
quick(a3,0,9);
print(a3,10);
printf("according to insert:");
insert(a4,10);
print(a4,10);
printf("according to shell:");
shell(a5,10);
print(a5,10);
}
Ⅵ c語言數組排序
你輸入的時候就不可能通過,怎麼可能存在a[3]啊,只能輸入3個數字,否則越界了。簡單的排序有冒泡,選擇,基數,歸並,希爾,插入,還有堆排序。
Ⅶ C語言怎樣對二維數組中每個元素進行選擇排序
#include<stdio.h>
#include"stdlib.h"
#include"time.h"
intmain(intargc,char*argv[]){
inta[5][8],i,j,k,t,*p;
printf("排序前: ");
srand((unsigned)time(NULL));
for(i=0;i<5;i++){//為二維數組賦值
for(j=0;j<8;printf("%3d",a[i][j++]=rand()%100));
printf(" ");
}
printf("排序後: ");
p=(int*)a;//降為一維,這樣排序簡單
for(t=i=0;i<40;i++){//選擇法排序
for(k=i,j=k+1;j<40;j++)
if(p[k]>p[j])
k=j;
if(k!=i)
j=p[k],p[k]=p[i],p[i]=j;
printf(++t%8?"%3d":"%3d ",p[i]);
}
return0;
}
Ⅷ C語言數組選擇排序法,超簡單,求解
for語句有4個部分內容for ( A;B;C ) D;其中A是初始化語句,每個for只執行A一次,B是循環條件,每次循環前執行判斷,如果不滿足則結束循環,D是在滿足循環條件時執行的,可以是一句或多句(多句時用大括弧括起來做整體處理),C是在執行D之後進行的後續處理。for語句執行的順序是:A,B,D,C,B,D,C,B,D,C,...,B結束
for(i=0;i<9;i++){
iTemp=a[i];iPos=i;
for(j=i+1;j<10;j++){
if(a[j]<iTemp){iTemp=a[j];iPos=i;}
}
a[iPos]=a[i];a[i]=iTemp;
}
假設數組a中輸入了十個數為:1,2,5,4,6,8,7,9,10,3,通過手動單步執行程序(把自己當成計算機),分析理解for語句的含義。
i=0;[i=0],i<9成立,開始循環
iTemp=a[i];[iTemp=a[0]=1],iPos=i;[iPos=0]
j=i+1;[j=0+1=1],j<10成立,開始循環:a[j]<iTemp不成立[a[j]=a[1]=2,2<1不成立],跳過不執行
j++;[j=2],j<10成立,繼續循環:a[j]<iTemp不成立[5<1],跳過不執行
j++;[j=3],j<10成立,繼續循環:a[j]<iTemp不成立[4<1],跳過不執行
j++;[j=4],j<10成立,繼續循環:a[j]<iTemp不成立[6<1],跳過不執行
...//沒有條件滿足讓if語句條件能得到執行,因為a[1]~a[9]都不小於iTemp
j++;[j=10],j<10不成立,結束循環
a[0]=a[0];a[0]=1;實際上a[0]值未變,通過以上處理a[0]保存a[0]之後所有數組中最小值
i++;[i=1],i<9成立,繼續循環
iTemp=a[i];[iTemp=a[1]=2],iPos=i;[iPos=1]
j=i+1;[j=2],j<10成立,開始循環:a[j]<iTemp不成立[5<2],跳過不執行
j++;[j=3],j<10成立,繼續循環:a[j]<iTemp不成立[4<2],跳過不執行
...//沒有條件滿足讓if語句條件能得到執行,因為a[2]~a[9]都不小於iTemp
j++;[j=10],j<10不成立,結束循環
a[1]=a[1];a[1]=2;實際上a[1]值未變,通過以上處理a[1]保存a[1]之後所有數組中最小值
i++;[i=2],i<9成立,繼續循環
iTemp=a[i];[iTemp=a[2]=5],iPos=i;[iPos=2]
j=i+1;[j=3],j<10成立,開始循環:a[j]<iTemp成立,iTemp=a[j];[iTemp=4],iPos=j;[iPos=3]
j++;[j=4],j<10成立,繼續循環:a[j]<iTemp不成立[6<4],跳過不執行
...
j++;[j=9],j<10成立,繼續循環:a[j]<iTemp成立,,iTemp=a[j];[iTemp=3],iPos=j;[iPos=9]
j++;[j=10],j<10不成立,結束循環
a[9]=a[2];a[2]=3;通過以上處理a[2]與a[2]之後所有數組中最小值的a[9]值互換
現在數組變成:1,2,3,4,6,8,7,9,10,5
...//每次i循環都會導致當前a[i]與之後最小值的元素互換值,結果是a[i]保存之後最小值
i++;[i=9],i<9不成立,結束循環
至此數組按照從小到大順序排序
上述循環中,i值指定當前要處理的元素,j值負責每次提供之後所有元素下標,在進行比較後,當前i指向元素會與之後最小值進行交換,保證當前元素是之後元素中最小的,從而進行9次這樣的處理後數組按順序已經排好序了。
Ⅸ C語言:用選擇排序法對一個數組里的數進行排序,從小到大,要求選出小的進行排序
#include<stdio.h>
intmain()
{
inti=0;
inta[10]={0,5,2,3,6,9,8,7,4,1};
intj=0;
inttmp=0;
intm=sizeof(a)/sizeof(a[0]);//s數組大小
for(i=0;i<m-1;i++)//比較m-1次
{
for(j=0;j<m-i-1;j++)//最後一次比較a[m-i-1]與a[m-i-2]
{
if(a[j]>a[j+1])//如果a[j]比a[j+1]大則交換內容
{
tmp=a[j+1];
a[j+1]=a[j];
a[j]=tmp;
}
}
}
for(i=0;i<m;i++)
{
printf("%d",a[i]);//列印
}
printf(" ");
return0;
}
(9)c語言數組選擇排序擴展閱讀
C語言排序法
把一個數組進行排序可以使用選擇排序法。選擇排序法的原理在是每一趟循環尋找數組中最小的數的下標,然後按照遞增的順序放入數組中。
循環找出最小數的下標,該下標用min保存,直到比較完整個數組,即可找到最小的數,然後將該數放入數組的第一位,這樣就排好了一個元素。
需要再嵌套一層外層循環即可排好所有元素。第二次循環就不用再比較第一個元素了,因為第一個元素已經排好,依次類推,每一次循環就會排好一個,進行n-1次循環即可排好所有元素。
Ⅹ 求C語言將數組元素大小排序!!
C語言將數組元素大小排序方法:
以下使用的是冒泡排序法實線數組從小到大排序。
思想:每次相鄰兩個數比較,若升序,則將大的數放到後面,一次循環過後,就會將最大的數放在最後。
10、2、3、4、5、6、9、8、7、1是輸入的待排序的數列,經過第一次排序,將最大的,10放在最後,第二次排序,將剩下的2、3、4、5、6、9、8、7、1進行冒泡,將當前最大的9放在倒數第二的位置,以此類推。
以下是具體代碼:
#include <stdio.h>
int main(){
int nums[10] = {10, 2, 3, 4, 5, 6, 9, 8, 7, 1};
int i, j, temp, isSorted;
//優化演算法:最多進行 n-1 輪比較
for(i=0; i<10-1; i++){
isSorted = 1; //假設剩下的元素已經排序好了
for(j=0; j<10-1-i; j++){
if(nums[j] > nums[j+1]){
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
isSorted = 0; //一旦需要交換數組元素,就說明剩下的元素沒有排序好
}
}
if(isSorted) break; //如果沒有發生交換,說明剩下的元素已經排序好了
}
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
printf(" ");
return 0;
}
(10)c語言數組選擇排序擴展閱讀:
其他將數組從小到大排序的演算法
以下使用的是選擇排序法實現數組從小到大排序。
思想:從第一個數開始,每次和後面剩餘的數進行比較,若升序,則如果後邊的數比當前數字小,進行交換,和後面的所有的數比較、交換後,就會將當前的最小值放在當前的位置
輸入的序列為10、2、3、4、5、6、9、8、7、1進行一次排序後將最小的數放在了第一位(a[0]與它後面的所有數進行比較,若a[0]比後面的數大,進行交換),以此類推。
以下是具體代碼:
#include <stdio.h>
int main(void){
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n為要排序的數的個數
//輸入需要排序的數
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下來進行排序
for(i=0;i<n-1;++i)//因為每次需要和a[i]後面的數進行比較,所以到a[n-2](倒數第2個元素)就行
{
for(j=i+1;j<n;++j)//j從i後一個開始,a[i]與a[j]進行比較
{
if(a[i]>a[j])//a[i]為當前值,若是比後面的a[j]大,進行交換
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//每排序一次,就會將a[i](包括a[i])之後的最小值放在a[i]的位置
for(j=0;j<n;++j)
printf("%-5d",a[j]);
printf(" ");
}
return 0;
}