C語言之Problem 2291 排序

2021-10-07 06:20:10 字數 1613 閱讀 6490

problem description

氣泡排序,想必大家都會吧!每次從左到右檢查相鄰的元素是否滿足a[i]>a[i+1],如果滿足,就交換位置i和位置i+1的元素的值,如果某次掃瞄整個陣列之後,沒有任何元素交換位置,那麼排序結束。

學姐學了氣泡排序之後,研究出了一種新的排序:冒泡泡排序!這個排序方式是氣泡排序的一點小改動:每次從左到右檢查連續三個值(三元組),如果滿足a[i]>a[i+2],那麼將這個三元組翻轉一下。

比如說陣列5,6,8,4,3:

第一次掃瞄陣列:

1、 檢查三元組5,6,8,由於a[i]2、 檢查三元組6,8,4,滿足a[i]>a[i+2],翻轉該三元組,陣列變為5,4,8,6,3;

3、 檢查三元組8,6,3,陣列變為5,4,3,6,8。

第二次掃瞄陣列:

1、 檢查三元組5,4,3,陣列變為3,4,5,6,8;

2、 檢查三元組4,5,6,陣列不發生變化;

3、 檢查三元組5,6,8,陣列不發生變化。

第三次掃瞄陣列:

掃瞄結束後,陣列與第二次掃瞄結束的陣列一樣,排序結束。

這個排序演算法聽起來很棒!但是聰明的學弟還是發現了乙個bug:在某些情況下這個演算法失效了!比如陣列:5,7,6就是乙個反例。

學姐現在很傷心,她想讓你幫幫她:對於給定的陣列,判斷冒泡泡排序是否能將其正確排序,如果可以,輸出「ok」;如果不行,輸出第乙個滿足a[i]>a[i+1]的位置。

input

多組資料。

每組資料第一行為正整數n,表示陣列大小。

第二行為n個正整數,表示待排序陣列。

保證所有資料不會超過int範圍

n≤100000

output

如果可以正確排序,輸出「ok」,否則輸出第乙個滿足a[i]>a[i+1]的位置(陣列下標從1開始)。

sample input5

5 6 8 4 3

38 9 7

sample outputok

2下面展示實現**

#include 

#include

using namespace std;

#include

int a[

100007

],b[

100007

],c[

100007];

int main()

else

}sort

(a,a+ai)

;sort

(b,b+bi)

; int j =

0, k =0;

for(int i =

1; i 1; i++

)else

} int ans =0;

for(int i =

1; i <

n; i++)}

if(ans)

else

}return0;

}

很好的思路,將奇數偶數字置的數分別排序,然後再比較√

以上。

C語言 C語言之continue

c語言迴圈 c 語言中的continue語句有點像break語句。但它不是跳出該迴圈語句,continue是跳過本次迴圈直接開始下一次迴圈的。在for迴圈裡,continue會跳過本次迴圈,但是自增語句仍然會執行,而在while和do while語句裡嘖是跳過迴圈重新執行判斷語句 課堂作業內容為 輸...

C語言之指標

指標型別的本質分析 1 指標的本質 指標的本質 一種復合的資料型別。下面我將以下面幾個作為例子進行展開分析 a int p b int p c int parvalue 3 d int pfun 分析 所謂的資料型別就是具有某種資料特徵的東東,比如資料型別char,它的資料特徵就是它所佔據的記憶體為...

C語言之陣列

c語言之陣列 一,一維陣列 1,一維陣列的定義 型別符 陣列名 常量表示式 注 1 常量表示式中可以包括常量和符號常量.int a 3 5 是合法的,int a n 是不合法的,c語言不允許對陣列的大小作動態定義 2 如果在被呼叫的函式 不包括主函式 中定義陣列,起長度可以是變數或非常量表示式,可稱...