python歸併排序
測試**如下↓
defguibing(list1):
n=len(list1)print(list1)if n == 1:returnlist1
half= n // 2left_res=guibing(list1[:half])
right_res=guibing(list1[half:])returnmergersort(left_res, right_res)defmergersort(a, b):
c=llen=len(a)
rlen=len(b)
h=0j=0while j < llen and h
j+= 1
else:
h+= 1
if j == len(a): #這裡不能簡單比較a、b長度
for i inb[h:]:
list1= [7, 9, 3, 4, 5, 8]print(guibing(list1))#print (list1)
f5執行程式,排序正常,注意這裡不能再列印傳入的list,因為返回的是新列表
python快速排序演算法例項分析
快速排序的時間複雜度是o(nlogn)
演算法描述:
① 先從序列中取出乙個數作為基準數
② 分割槽過程, 將比這個數大的數全部放到它的右邊, 小於或等於它的數全部放到它的左邊
③ 再對左右區間重複第二步, 直到各區間只有乙個數
假設對 6, 1, 2, 7, 9, 3, 4, 5, 10, 8 進行排序, 首先在這個序列中隨便找乙個基準數(用來參照), 比如選擇 6 為基準數, 接下來把所有比基準數大的數放在6的右邊, 比6小的數放在左邊
原理分析:
① 選擇最左邊的數為基準數key
② 設立兩個游標 low 和 high , 分別指向陣列的最低位和最高位
③ 然後high先動, 如果high位上的數比key大, 則向前走, 如果high-1位上的數比key大, 繼續向前走, 直到該位上的數<=key
④ 此時比較low位, 如果<=key, low向後走, 變為low+1, 依次類推, 直到該位上的數比key大
⑤ 交換high和low位上的數
⑥ 重複以上步驟, 直到low=high , 交換 key 和 high 位上的值
⑦ 最後進行遞迴操作
**如下
#!/usr/bin/env python
# coding:utf-8
# 設定最低位和最高位
def quicksort(nums, low, high):
# 設定乙個比較基準key
key = nums[low]
while low
# 如果最高位的數 大於等於 key則向前走
while low= key:
high -= 1
# 如果最低位的數 小於等於 key則向後走
while low
low += 1
# 交換值
nums[low], nums[high] = nums[high], nums[low]
#最後low=high, 此時交換key和high位上的值, 使小於key的值在key左邊, 大的在key右邊
nums[nums.index(key)], nums[low] = nums[low], nums[nums.index(key)]
# 返回最低位的位置
return low
# 進行重複操作
def interval(nums, low, high):
if low
# 進行排序並得到最低位位置以迴圈操作
key_index = quicksort(nums, low, high)
interval(nums, low, key_index)
interval(nums, key_index+1, high)
nums = [64,3,9,2,4,7,0,12,45,]
interval(nums, 0, len(nums)-1)
print ("測試結果:")
print (nums)
#[0, 2, 3, 4, 7, 9, 12, 45, 64]
快速排序例項
include stdafx.h include define cutoff 3 int array void insert sort int array,int size array j temp print array array,size void print array int array,...
快速排序例項
快速排序是根據待排序陣列中的某一值val,將待排序陣列分割成兩部分資料,前一部分陣列比val小 後一部分陣列比val大,之後對每部分資料重複上述過程,最終實現待排序陣列的有序性,例項如下 public class quicksortmain 切分待排序陣列 param arr param low p...
快速排序例項
void sort int a,int left,int right int i left int j right int key a left while i a i a j 找到乙個這樣的數後就把它賦給前面的被拿走的我的值 如果第一次迴圈且鍵是 乙個 左 那麼就是給金鑰 while i a i ...