C语言 · 选择排序
算法提高 選擇排序
時間限制:1.0s 內存限制:256.0MB
選擇排序
問題描述
排序,顧名思義,是將若干個元素按其大小關系排出一個順序。形式化描述如下:有n個元素a[1],a[2],…,a[n],從小到大排序就是將它們排成一個新順序a[i[1]]<a[i[2]]<…<a[i[n]]
i[k]為這個新順序。
選擇排序的思想極其簡單,每一步都把一個最小元素放到前面,如果有多個相等的最小元素,選擇排位較考前的放到當前頭部。還是那個例子:{3 1 5 4 2}:
第一步將1放到開頭(第一個位置),也就是交換3和1,即swap(a[0],a[1])得到{1 3 5 4 2}
第二步將2放到第二個位置,也就是交換3和2,即swap(a[1],a[4])得到{1 2 5 4 3}
第三步將3放到第三個位置,也就是交換5和3,即swap(a[2],a[4])得到{1 2 3 4 5}
第四步將4放到第四個位置,也就是交換4和4,即swap(a[3],a[3])得到{1 2 3 4 5}
第五步將5放到第五個位置,也就是交換5和5,即swap(a[4],a[4])得到{1 2 3 4 5}
輸入n個整數,輸出選擇排序的全過程。
要求使用遞歸實現。
輸入格式
第一行一個正整數n,表示元素個數
第二行為n個整數,以空格隔開
輸出格式
共n行,每行輸出第n步選擇時交換哪兩個位置的下標,以及交換得到的序列,格式:
swap(a[i],a[j]):a[0] … a[n-1]
i和j為所交換元素的下標,下標從0開始,最初元素順序按輸入順序。另外請保證i<=j
a[0]…a[n-1]為交換后的序列,元素間以一個空格隔開
樣例輸入
5
4 3 1 1 2
樣例輸出
swap(a[0], a[2]):1 3 4 1 2
swap(a[1], a[3]):1 1 4 3 2
swap(a[2], a[4]):1 1 2 3 4
swap(a[3], a[3]):1 1 2 3 4
swap(a[4], a[4]):1 1 2 3 4
數據規模和約定
n<=100
整數元素在int范圍內
1 #include<stdio.h>
2 int n;
3 int a[200];
4 void dfs(int begin){
5 if(begin+1>n){//出口
6 return;
7 }else{
8 int min=begin;//定義一個最小值存放最小值的小標
9 for(int i=begin+1;i<n;i++){//前面排好了,在后面沒排的中找
10 if(a[min]>a[i])//決定升序降序
11 min = i;//將更小值的小標賦給min
12 }
13 printf("swap(a[%d], a[%d]):",begin,min);//按題意:min<begin
14 int t = a[min];//交換值唄
15 a[min] = a[begin];
16 a[begin] = t;
17 for(int i=0;i<n;i++){//輸出唄
18 printf("%d ",a[i]);
19 }
20 printf("
");
21 dfs(begin+1);//找下一個唄
22 }
23 }
24 int main(){
25 scanf("%d",&n);
26 getchar();//處理回車
27 for(int i=0; i<n; i++){
28 scanf("%d",&a[i]);
29 }
30 dfs(0);//從第0個位置開始
31 return 0;
32 }
總結
以上是生活随笔為你收集整理的C语言 · 选择排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM体系的7种工作模式
- 下一篇: SPI通信的基础知识