藍橋杯 基礎練習(十三) 數列排序 C語言

2021-09-10 06:04:36 字數 2269 閱讀 4367

問題描述

給定乙個長度為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。輸出格式 輸出一行,按從小到大的順序輸出排序後的數列。樣例輸...