c語言選擇排序法代碼
㈠ c語言 用選擇法排序
這是我寫的代碼 , 但不知道你是在哪個網站上做的,沒法測試,不過應該沒問題
#include <iostream>
using namespace std;
int main()
{
int n,a[1000],temp;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(int i=0;i<n;i++)
{
printf("%6d",a[i]);
}
cout<<endl;
}
return 1;
}
㈡ C語言選擇法排序
排序如下:
voidSelectSort(RecordTyper[],intlength)/*對記錄數組r做簡單選擇排序,length為待排序記錄的個數*/
{inttemp;for(i=0;i<length-1;i++)//n-1趟排序{intindex=i;//假設index處對應的數組元素是最小的for(intj=i+1;j<length;j++)//查找最小記錄的位置if(r[j].key<r[index].key)index=j;if(index!=i)//若無序區第一個元素不是無序區中最小元素,則進行交換{temp=r[i];r[i]=r[index];r[index]=temp;}}}
初始序列:{49 27 65 97 76 12 38}
第1趟:12與49交換:12{27 65 97 76 49 38}
第2趟:27不動:12 27{65 97 76 49 38}
第3趟:65與38交換:12 27 38{97 76 49 65}
第4趟:97與49交換:12 27 38 49{76 97 65}
第5趟:76與65交換:12 27 38 49 65{97 76}
第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]交換,使有序序列不斷增長直到全部排序完畢。
拓展資料
下面也寫個例子:
由大到小時:
intmain(void){inta[10];inti,j,t,k;for(i=0;i<10;i++)scanf("%d",&a[i]);/*輸入10個數,比武報名,報名費用10000¥^_^*/for(i=0;i<9;i++)/*10個數,所以只需比9次*/{k=i;/*裁判AND記者實時追蹤報道比賽情況*/for(j=i+1;j<10;j++)if(a[k]<a[j])k=j;/*使a[k]始終表示已比較的數中的最大數*/if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}/*t發放獎品*/}for(i=0;i<10;i++)printf("%4d",a[i]);/*顯示排序後的結果*/return0;}
由小到大時:
intmain(void){inta[10];inti,j,t,k;for(i=0;i<10;i++)scanf("%d",&a[i]);/*輸入10個數,比武報名,報名費用10000¥^_^*/for(i=0;i<9;i++){k=i;/*裁判AND記者實時追蹤報道比賽情況*/for(j=i+1;j<10;j++)if(a[k]>a[j])k=j;if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}/*t發放獎品*/}for(i=0;i<=9;i++)printf("%4d",a[i]);/*顯示排序後的結果*/return0;}
㈢ C語言編程:選擇法排序
選擇排序是一種簡單直觀的排序演算法。
工作原理:
每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
性能:
選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)。
選擇排序的時間復雜度是O(n^2)
思想:
n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
①初始狀態:無序區為R[1..n],有序區為空。
②第1趟排序
在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
……
③第i趟排序
第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
C語言版代碼:
#include<stdio.h>
#include<math.h>
#defineMAX_SIZE101
#defineSWAP(x,y,t)((t)=(x),(x)=(y),(y)=(t))
voidsort(int[],int);/*selectionsort*/
intmain()
{
inti,n;
intlist[MAX_SIZE];
printf(":");
scanf_s("%d",&n);
if(n<1||n>MAX_SIZE){
fprintf(stderr,"Impropervalueofn ");
exit(1);
}
for(i=0;i<n;i++){/*randomlygeneratenumbers*/
list[i]=rand()*1000;
printf("%d",list[i]);
}
sort(list,n);
printf(" Sortedarray: ");
for(i=0;i<n;i++)/*printoutsortednumbers*/
printf("%d",list[i]);
printf(" ");
return0;
}
voidsort(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語言選擇排序法
#include<stdio.h>
voidswap(int*a,int*b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
voidsort(int*a,unsignedintn,unsignedintm)
{
intmin;
intminSite;
for(inti=0;i<n;++i)
{
min=a[i];
minSite=i;
for(intj=1;j<n;++j)
{
if(a[j]<min)
{
min=a[j];
minSite=j;
}
}
swap(&a[i],&a[minSite]);
if(i<m)
{
for(inti=0;i<n;++i)
printf("%d",a[i]);
putchar('
');
}
}
}intmain()
{
inta[20];
unsignedintn,m;
printf("請輸入個數n和需要顯示的次數m:
");
scanf("%u%u",&n,&m);
printf("請輸入n個整數:
");
for(inti=0;i<n;++i)
{
scanf("%d",&a[i]);
}
printf("m次輸出如下:
");
sort(a,n,m);
return0;
}
㈤ C語言用選擇法排序
#include<stdio.h>
voidselect_sort(int*x,intn);
voidmain(void)
{
inta[]={6,3,42,23,35,71,98,67,56,38};
for(inti=0;i<10;i++)
printf("%-5d",a[i]);
printf(" ");
select_sort(a,10);
for(intj=0;j<10;j++)
printf("%-5d",a[j]);
}
voidselect_sort(int*x,intn)
{
inti,j,min,t;
for(i=0;i<n-1;i++)/*要選擇的次數:0~n-2共n-1次*/
{
min=i;/*假設當前下標為i的數最小,比較後再調整*/
for(j=i+1;j<n;j++)/*循環找出最小的數的下標是哪個*/
{
if(*(x+j)<*(x+min))
{
min=j;/*如果後面的數比前面的小,則記下它的下標*/
}
}
if(min!=i)/*如果min在循環中改變了,就需要交換數據*/
{
t=*(x+i);
*(x+i)=*(x+min);
*(x+min)=t;
}
}
}
㈥ c語言選擇排序的程序代碼
選擇排序改進了冒泡排序,每次遍歷列表只做一次交換,為了做到這一點,一個選擇排序在遍歷時尋找最大的值,並在完成遍歷後,將其放到正確的地方。
第二次遍歷,找出下一個最大的值。遍歷n-1次排序n個項,最終項必須在n-1次遍歷之後。
接下來呢,我們直接進行把最小值放到已排序序列末尾的操作。當然這是第一輪循環,還沒有產生已排序的序列。0就是已排序序列的開頭數字了。
第二輪初始化開始,我們繼續選取假設的最小值,這次,我們還是選取第一個數字作為假設的最小值,需要注意的是,0已經是已排序序列,我們要從未排序的序列中選取第一個數字,也就是(5、1、8、6、2、3、4、9、7)無序序列中的數字5。
㈦ 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語言選擇排序法
這是選擇排序。先用a[0]與a[1]比較,當a[0]<a[1]時並不交換,而用k記下來現在a[0]最小……這樣一趟比較完後a[k]就是整個數組中最小的元素,把它與a[0]交換;第二趟,從a[1]開始重復前面的操作,那麼最後a[1]就是剩下的n-1個元素中最小的……看a[0]、a[1]已經由小到大排好了,當做完n-1趟時不就把整個數組都排好了嗎?注意:t=array[k];array[k]=array[i];array[i]=t;不是for(j=i+1;j<n;j++)的循環體,要等它循環完了後才執行一次。