問題描述
給定乙個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200
輸入格式
第一行為乙個整數n。
第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。
輸出格式
輸出一行,按從小到大的順序輸出排序後的數列。
樣例輸入
58 3 6 4 9
樣例輸出
3 4 6 8 9
這道題就是簡單的排序問題啦~ 用蠻力法搞定就行啦~ (終於不是上一道那種對筆者來說超級難的題了,感動)
說到蠻力法,蠻力法中有關數列排序的主要是選擇排序和氣泡排序兩種。 (筆者開啟老師的ppt,一本正經地說道。)
所以筆者就打算將這兩種方法都用一下,鞏固鞏固。
首先是選擇排序。
選擇排序,就是將數列分為有序區和無序區,初始階段,有序區為空,然後每次都從無序區里找到乙個最小的值放到有序區中。
理論上大概是這樣, **如下:
#include
int main()
for(i=
0;i1;i++
)//由上面的概念可知,有序區每次都加一,即無序區中需要排列的數字每次都少乙個,所以用i}if
(min!=i)
//如果最小值與假設的不一樣,則將最小值與第乙個數字交換位置
}for
(i=0
;i)return0;
}
讀者最好自己寫一組數列再看概念及**,應該更容易看懂一些哦~
而氣泡排序呢,就很簡單了~
它的基本思想是:
1、和選擇排序一樣,分為有序區和無序區,但這裡需要注意的是,選擇排序有序區在左邊,而氣泡排序的有序區在右邊(無序區略)
2、enmmm,也和選擇排序一樣,初始時,有序區為空,無序區為整個數列。
3、第一次「冒泡」相鄰元素依次兩兩比較,將較大者/較小者交換到後面,成為有序區的第乙個元素。
**如下:
#include
int main()
for(i=
0;i1;i++)}
}for
(i=0
;i)return0;
}
這個很簡單的,我就不解釋啦~~
這裡要說一點,筆者看了一下老師的ppt,才發現以上這段只是氣泡排序的一種演算法,其實後面還有一種比較複雜的,**如下:
#include
int main()
int exchange=n-1;
while
(exchange!=0)
//當序列有序時,exchange=0}}
for(i=
0;i)return0;
}
這個詳細解釋筆者也解釋不來,同樣,讀者只需要列一段數列看著**「執行」一遍就一目了然了。
這裡主要新增了exchange變數,來判斷一次冒泡後序列是否是有序序列,如果序列在while中數字位置經過變換,則需要繼續執行一遍迴圈。
最後,筆者對這三種方法的有略進行了比較,從每種演算法的最優/最差比較次數以及最優/最差交換次數上看:
選擇排序:
冒泡演算法1:
而冒泡的兩種演算法,第二種演算法是第一種的公升級版,所以應該是第二種比較好。
但是,評測系統給出的比較筆者真的是…有點無法理解啊!
直接上圖:
從上至下依次是:冒泡1,冒泡2,選擇
沒錯,居然是冒泡演算法1好一點???
也許是評測系統用的那10個例子的鍋吧?可惜筆者不是vip,沒法檢視系統另外的9個輸入了什麼鬼…
總結完畢~ 撒花 ~~
藍橋杯基礎練習 數列排序
問題描述 給定乙個長度為n的數列,將這個數列按從小到大的順序排列。1 n 200 輸入格式 第一行為乙個整數n。第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。輸出格式 輸出一行,按從小到大的順序輸出排序後的數列。樣例輸入 58 3 6 4 9 樣例輸出 3 4 6 8 9 最近學...
藍橋杯 基礎練習 數列排序
問題描述 給定乙個長度為n的數列,將這個數列按從小到大的順序排列。1 n 200 輸入格式 第一行為乙個整數n。第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。輸出格式 輸出一行,按從小到大的順序輸出排序後的數列。樣例輸入 58 3 6 4 9 樣例輸出 3 4 6 8 9 氣泡排...
C 藍橋杯 基礎練習之數列排序
資源限制 時間限制 1.0 s 記憶體限制 512.0 mb 問題描述 給定乙個長度為n的數列,將這個數列按從小到大的順序排列。1 n 200 輸入格式 第一行為乙個整數n。第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。輸出格式 輸出一行,按從小到大的順序輸出排序後的數列。樣例輸...