交換,指的是根據序列中的兩個元素關鍵字的比較結果來對換這兩個元素在序列中的位置。在眾多的排序演算法中,冒泡和快排屬於交換排序。
1、基本思想:
類似於水中冒泡,較小的浮上來,較大的沉下去。將兩個數進行比較,較大的數往後移動,較小的數往前移動。
2、演算法描述:
將序列最後乙個元素與前乙個元素進行兩兩比較,如果為逆序,那麼交換元素位置;
按照的上面的做法往前進行兩兩比較,直到第乙個元素,那麼第乙個元素將為最小值,且為最終位置;
對剩餘序列按照上述兩個步驟進行比較,直到排序完成。
3、編碼實現:
def swap(s, a, b):
temp = s[a]
s[a] = s[b]
s[b] = temp
def bubblesort(instr):
n = len(instr)
for i in range(n-1):
for j in range(i,n)[::-1]:
if instr[j-1] > instr[j]:
swap(instr, j-1, j)
if __name__ == '__main__':
instr = input().split()
bubblesort(instr)
print(''.join(instr))
以上**便是冒泡法實現排序,比較的次數與序列的初始狀態無關,始終是n*(n-1)/2,因此時間複雜度為o(n^2)。使用常數個輔助單元,因此空間複雜度為o(1)。
但是如果在初始序列有序的情況下,這樣進行比較,無疑浪費資源和時間。為了提高效率,可以設定了乙個變數flag,如果flag為0那麼說明該組序列為有序序列,不需要再進行氣泡排序比較,直接退出迴圈即可。這樣,最好情況下,移動次數為0,比較次數為n-1次,時間複雜度為o(n)。編碼如下:
def swap(s, a, b):
temp = s[a]
s[a] = s[b]
s[b] = temp
def bubblesort(instr):
n = len(instr)
for i in range(n-1):
flag = 0
for j in range(i,n)[::-1]:
if instr[j-1] > instr[j]:
swap(instr, j-1, j)
flag = 1
if flag == 0:
return
if __name__ == '__main__':
instr = input().split()
bubblesort(instr)
print(''.join(instr))
4、示例:
對初始序列:5,4,3,2,1 進行從小到大排序
第一趟排序過程:比較4次
第二趟排序過程:比較3次
第三趟排序過程:比較2次
第四趟排序過程:比較1次
5、演算法分析:
每趟排序進行n-1次比較,每趟比較後都有乙個元素放在最終位置,剩餘排序個數為n-1。一共需要n-1趟比較。最好的情況下,比較次數為n,移動次數為0,時間複雜度為o(n);最壞情況下,比較次數為n*(n-1)/2,移動次數為3*n*(n-1)/2,時間複雜度為o(n^2)。由於元素相等時,不會進行交換操作,所以氣泡排序是一種穩定的排序演算法。
1、基本思想:基於分治法,通過一趟排序將待排序的序列分為兩部分,一部分序列中的元素都比基準元素小,另一部分序列中的元素都比基準元素大,然後分別對這兩部分序列進行排序,直到整個序列有序。
2、演算法描述:
從序列中選擇乙個基準元素;
對序列進行排序,所有比基準元素小的放在前面,所有比基準元素大的放在後面,並返回基準元素的最終位置;
根據基準元素的位置將序列分為兩個子串行;
對每部分的序列進行上述三個步驟操作,直到序列有序。
3、編碼實現:
def partition(instr, low, high):
p = instr[low]
while low < high:
while low < high and instr[high] >= p:
high = high-1
instr[low] = instr[high]
while low < high and instr[low] <= p:
low = low+1
instr[high] = instr[low]
instr[low] = p
return low
def quicksort(instr, low, high):
if low < high:
p = partition(instr,low,high)
quicksort(instr,low,p-1)
quicksort(instr,p+1,high)
if __name__ == '__main__':
instr = input().split()
quicksort(instr,0,len(instr)-1)
print(''.join(instr))
4、示例:
對初始序列:3,5,1,6,2,7,4,9進行從小到大排序,以第1個元素為基準
第一次分割槽:分為兩部分
以3為基準分為兩部分,然後對3前面和後面的兩個序列進行如上分割槽,直到序列有序。
5、演算法分析:
每次排序後,基準元素都將被放到在序列中的最終位置上。在最好的情況下,空間容量與遞迴呼叫的最大深度一致,為log2(n+1),最壞情況下,要進行n-1次遞迴呼叫,棧的深度為n-1,因此,最壞情況下空間複雜度為o(n),平均情況下為o(log2 n)。在最好的情況下,時間複雜度為o(n log2 n),最壞情況下,時間複雜度為o(n^2)。如果在排序過程中,有兩個元素均小於基準元素,那麼都將被移動,原本次序發生變化,可能導致最終次序與原來次序不一致,因此快速排序是一種不穩定的排序方法。
交換排序 氣泡排序 和 快速排序
通過對比大小交換對比的元素所得到的排序為交換排序。冒牌排序時很常見的 通過對比相鄰元素的大小如果前面的元素比後面的大,則交換兩個元素,使得大的元素往後移。一 氣泡排序 二 快速排序,本文重點 快速排序在一次排序中有兩個方向,乙個是從尾部向前 逆向 乙個是從首部標誌 不包括首部標誌 向後 正向 正向和...
交換排序 氣泡排序和快速排序
1 氣泡排序演算法思想及實現 這是最原始,也是眾所周知的最慢的演算法了。基本思想 按待排序序列的先後順序,依次比較相鄰的兩個數,將小數放在前面,大數放在後面 若二者是公升序,則不作任何操作,否則交換兩個數即可 即在第一趟 首先比較第1個數和第2個數,將小數放前面,大數放後面。然後比較第2個數和第3個...
交換排序 氣泡排序和快速排序
1.氣泡排序 1 演算法思想 將序列中的第乙個元素和第二個元素相比較,如前者大於後者,則交換,否則不交換 再將第二個元素和第三個元素比較,若前者大於後者,則交換兩個元素的位置,否則不交換,依次進行,直到最後乙個元素,經過如此一輪,則n個元素中最大的乙個被放在了最後。此後,再進行相同的過程。2 基本實...