python交叉輸出 Python交叉排序

2021-10-11 11:18:45 字數 2236 閱讀 7510

最近在系統學習python的知識,學完排序之後,遇到了乙個排序的具體問題,問題具體描述如下:

時間限制:1000ms

空間限制:5000k

輸入一行 k

個用空格分隔開的整數,依次為 n1,

n2 … nk。請將所有下標不能被

3 但可以被 2

整除的數在這些數字原有的位置上進行公升序排列,此外,將餘下下標能被 3 整除的數在這些數字原有的位置上進行降序排列。

輸出包括一行,與輸入相對應的若干個整數,為排序後的結果,整數之間用空格分隔。

樣例1輸入:

1 5 4 3 10 7 19

輸出:1 3 7 5 10 4 19

提示資訊

請注意,題面中的下標是從 1

開始的哦!

這道題其實本身很簡單,按照要求,把對應位置上的需要公升序的資料取出,然後把對應位置上的需要降序的資料取出,分別排序就可以完成了,這樣的**,寫起來有點繁瑣,但是是最快的演算法,有時候**繁瑣,運算快速也不失是一種選擇。

但是,與此同時,我在探索簡潔的**解決此問題的方法,首先想到的是給出排序的準則,進行定製型的排序,python的sort函式是可以指定排序準則函式的,sort函式,第乙個引數指定排序的物件,第二個引數,即可給出排序的準則。

對於這道題的排序準則,分別三條,首先是下標不能被3整除,但是能被2整除的資料,排序準則為從小到大;其次是下標能被3整除的資料,排序準則為從大到小;最後是剩下的其餘資料,保持不動,描述保持原位置的排序準則,其實就是按照其下標大小進行排序。

確定這樣的三條排序準則後,在**中寫出來即可,但是問題是sort函式用comp進行排序,是得不到正確答案的,原因是sort裡面的演算法封裝的是適用於普遍的排序的演算法,對於一般的排序,其問題滿足自反性,對稱性和傳遞性。但是,顯然上面描述的問題,並不滿足傳遞性。因為比如分別選擇下標是2,4,5的數字,加入首先有偏序對(2,4)∈r,同時有(2,5)∈r,因為2,4的下標的需要看資料(屬於不能整除3,並且能被2整除的),2,5的下標直接比較下標,但是這時候顯然對於偏序對(5,4)不屬於這個關係(這裡要(4,5)就對了)。

因此不能直接使用已封裝的sort,那麼對於這種的問題,需要採用兩兩逐對比較的方式,採用類似冒泡的排序演算法就可以解決這個問題了,但是其時間複雜度由原來的小於o(nlogn)上公升到了o(n*n),好處就是**整潔,不冗長,這裡就需要自己衡量具體問題中到底使用哪種演算法了。

附上ac的**:

#coding=utf-8

def comp(

a, b ):

if( a[ 1 ] % 3 != 0 and b[ 1 ] % 3 != 0 ):

if( a[ 1 ] % 2 == 0 and b[ 1 ] % 2 == 0 ):

return

a[ 0 ] > b[ 0 ]

#end if

#end if

elif( a[ 1 ] % 3 == 0 and b[ 1 ] % 3 == 0 ):

return a[ 0 ] < b[ 0 ]

#end elif

return a[ 1 ] > b[ 1 ]

#end

comp

input_s =

raw_input()

input_s =

input_s.split( ' ' )

input_int

for i in

range( len( input_s ) ):

#end

forfor i in

range( len( input_int ) ):

for j in

range( i + 1, len( input_int ), 1 ):

if( comp( input_int[ i ], input_int[ j ] ) ):

temp

= input_int[ i ][ 0 ];

input_int[ i ] = ( input_int[ j ][ 0 ], input_int[ i ][ 1 ]

input_int[ j ] = ( temp, input_int[ j ][ 1 ] )

#end if

#end

for#輸出

for i in

range( len( input_s ) - 1 ):

print input_int[ i ][ 0 ],

#end

forprint

input_int[ len( input_int )- 1 ][ 0 ]

python怎麼輸出n的多次方 Python輸出

簡單來說,就是將程式的執行結果顯示出來。print hello world 比如有以下 pirnt 我今年10歲 pirnt 我今年11歲 pirnt 我今年12歲 在輸出年齡的時候,用了多次 我今年xx歲 能否簡化一下程式呢?字串格式化看如下 age 10 print 我今年 d歲 age age...

Python 交叉編譯

情況說明 自己想要在windows 虛擬機器ubuntu18.04 中編譯python直譯器,以移植到arm平台上執行,主要目標是在arm qemu中進行執行。編譯環境 ubuntu 18.04 編譯器 gcc,arm linux gnueabi python版本 2.7.3 和 3.5.5 整個過...

python輸出 Python輸出

簡單來說,就是將程式的執行結果顯示出來。print hello world 比如有以下 pirnt 我今年10歲 pirnt 我今年11歲 pirnt 我今年12歲 在輸出年齡的時候,用了多次 我今年xx歲 能否簡化一下程式呢?字串格式化看如下 age 10 print 我今年 d歲 age age...