1. 程式人生 > >幾種常用的排序演算法(一)--python實現

幾種常用的排序演算法(一)--python實現

1. 選擇排序,時間複雜度O(n^2),演算法不穩定。

    思路:(1)迴圈整個陣列 arr,選出最大的數,將它放在空陣列 new_arr 的第一個位置。

               (2)將剛剛選出的數字從 arr 中去掉。

               (3)迴圈前兩個步驟,直到 arr 中沒有數字。

下面我寫了兩個函式,當然寫在一起也是可以的。

# -*- coding:utf-8 -*-
#查詢到陣列中最大數的下標
def find_biggest(arr):
	biggest = arr[0]  #biggest用來儲存陣列中最大的數
	big_index = 0
	for i in range(1, len(arr)):
		if arr[i] > biggest:
			biggest = arr[i]
			big_index = i
	return big_index

#選擇排序 時間複雜度O(n*n)
def select_sort(arr):
	new_arr = []
	for i in range(0,len(arr)):
		temp = find_biggest(arr)
		new_arr.append(arr[temp])
		arr.pop(temp)
	return new_arr

#測試
arr = [0, 1, 3, 5, 8 ,6 ,7, 9]
print(arr[find_biggest(arr)]) 
print(select_sort(arr)) 

2. 快速排序,時間複雜度O(n*logn),演算法不穩定。

    思路:分而治之,採用遞迴。 首先在陣列中隨機選擇一個數作為基準(pivot),然後將陣列分成兩部分,小於基準的為一部分, 

               其餘的為另一個部分。然後對形成的兩個陣列採用相同的辦法,直到被分成陣列中的元素小於數小於2.

               結束遞迴的條件,就是陣列中的元素數小於2. 

# -*- coding:utf-8 -*-
# 快速排序,分而治之,是為遞迴
def quick_sort(arr):
	if len(arr) < 2:
		return arr
	else:
		pivot = arr[0]
		# 列表生成式
		small = [ i for i in arr[1:] if i < pivot ]
		big = [ i for i in arr[1:] if i > pivot ]
	return quick_sort(small) + [pivot] + quick_sort(big)

#測試
arr = [1, 4,7, 2, 5, 8, 3, 6, 9]
print(quick_sort(arr)) 
3. 氣泡排序,時間複雜度O(n^2),演算法穩定。

     思路:將陣列第一個元素,與其後所有元素比較,若第一個元素大於後面某個元素,則交換兩者,迴圈一遍找最小的元素且放在               

                了第 一 個位置。

                同樣迴圈比較所有的元素,則排序完成。

# -*- coding:utf-8 -*-
#氣泡排序
def change_sort(arr):
	for i in range(len(arr)) :
		for j in range(i+1, len(arr)) :
			if arr[i] > arr[j]:
				temp = arr[i]
				arr[i] = arr[j]
				arr[j] = temp
	return arr

#測試	
arr = [1, 4, 7, 2, 5, 8, 3, 6, 9]
print(change_sort(arr))
4.直接插入排序,時間複雜度O(n^2),演算法穩定

   思路:在插入新的一個元素時,他前面的元素已經排好序,所以只需要找到他自己的位置插入便可以了。

              在實際操作中,我們將第一個元素作為已經排好序的陣列,逐步插入陣列中其他的元素。

              首先,總體上要將第二個元素到最後一個元素都插入,所以要有個迴圈。 然後,在一次迴圈中要找到插入位置,

              我們將要插入的元素,前一個元素比較,如果小於前一個元素,則將前一個元素後移一位,但是此時不要將要插入

              直接插入,要與在前一個元素比較,迴圈如此,直到比較到第一個元素,或者要插入的元素大於比較的元素,此時

              將要插入的元素直接插入。

# -*- coding:utf-8 -*-
# 直接插入排序
def insert_sort(arr):
	if len(arr) < 2:
		return  arr
	for i in range(1, len(arr)):
		if arr[i] < arr[i-1]:
			temp = arr[i]
			j = i - 1
			while j >= 0 and temp < arr[j]:
				arr[j+1] = arr[j]
				j = j - 1
			arr[j+1] = temp
	return arr

#測試
arr = [1, 4, 7, 2, 5, 8, 3, 6, 9]
print(insert_sort(arr))
			 

 

相關推薦

常用排序演算法--python實現

1. 選擇排序,時間複雜度O(n^2),演算法不穩定。     思路:(1)迴圈整個陣列 arr,選出最大的數,將它放在空陣列 new_arr 的第一個位置。                (2)將剛

常用排序演算法冒泡、選擇、快速的Java實現

       學習Java有一陣子了,現在還處於比較初級的水平,能夠把簡單的程式寫對就不錯了,更不用談現在能夠拿Java做什麼了。        學完了兩段網路視訊課程,接下來找本書簡單看看。只要有了一個初步的認識,接下來的東西應該可以更加順利一些。學習程式設計最好的方法就

常用排序算法 ()

實現 void 交換 完成 快速 並排 元素 [] log 八大常用排序算法詳細分析 包括復雜度: 排序有可以分為以下幾類: (1)、交換排序:冒泡排序、快速排序 (2)、選擇排序:直接選擇排序、堆排序 (3)、插入排序:直接插入排序、希爾排序 (4)、歸並排序 (5)、

Java-經典排序演算法

前言: 排序演算法有很多種,如選擇排序、插入排序、氣泡排序、桶排序、快速排序等等。這裡介紹的是簡化版桶排序、氣泡排序和插入排序。 推薦一本演算法入門書——《啊哈!演算法》 1. 桶排序[簡化版]: 原理:新建一個book陣列用來標記原陣列每一個數字出現的個數。

常用排序演算法的思路和複雜度對比

1、插入排序——直接插入排序、希爾排序 (1)直接插入排序思路:從第1號元素開始,每個元素依次與前面的元素做比較,小的排前面,這樣當比較到最後一 個元 素完即完成排序。 (2)希爾排序思路:     

排序演算法------氣泡排序

氣泡排序 氣泡排序: 兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序記錄為止 氣泡排序是將比較大的數字沉在最下面,較小的浮在上面 最簡單的氣泡排序 /* * 嚴格意義上說不滿足氣泡排序思想,應該是最簡單的交換排序而已 * 思路:讓每一個關鍵字

排序演算法氣泡排序,簡單選擇排序,直接插入排序,希爾排序

氣泡排序,簡單選擇排序,直接插入排序是三種複雜度為O(n2)的演算法,希爾排序在特殊增量序列的時候可以獲得複雜度為O(n3/2) 氣泡排序 1、最簡單的排序實現 這裡把每個數和這個數之後的每個數比較,大於就交換位置。 缺點:多出了很多次沒有用的交

Java實現常見排序方法 .

 插入排序的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。其具體步驟參見程式碼及註釋。 [java] view plaincopyprint? /**  * 插入排序<br/>  * <ul> 

Matplotlib中常用的圖形

條形圖 條形圖常常用來描述一組資料的對比情況,例如:一週七天,每天的城市車流量等。【條形圖有兩個引數x,y】bar()繪製豎直條形圖、barh()繪製水平條形圖。 匯入繪圖工具包: import matplotlib.pyplot as plt imp

常用排序演算法總結

選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 冒泡法:  這是最原始,也是眾所周知的最慢的演算法了。他的名字的由來因為它的工作看來象是冒泡:  複雜度為O(n*n)。當資料為正序,將不會有交換。複雜度為

排序演算法 ——基礎

1.定義: 排序(sort)是將一組資料按照一定的規則來進行排列,一般按照遞增或遞減的順序來進行排列,排序演算法是一種基本的演算法。 2.排序演算法的分類 3.排序演算法的優劣 如何判斷排序演算法的優劣: 計算的複雜度:為了全面考慮,往往從最差、平均和最好三種情況進行

3插入排序演算法php

1.直接插入排序(插入排序) function InsertSort($arr, $n) {     for ($i = 1; $i < $n; $i ++) {         $t = $

Android --小功能 Android中影象特效處理

這一節給大家分享的是Android中幾種影象特效處理的小技巧,比如圓角,倒影,還有就是圖片縮放,Drawable轉化為Bitmap,Bitmap轉化為Drawable等等. 廢話少說了,直接講解今天的例項,本例主要是先獲取桌布(getWallpaper()),然後對當前

排序演算法選擇排序和氣泡排序

1. 選擇排序: 選擇排序是一種很簡單直觀的排序方法,就是在未排序的資料中挑選出最大或者最小的元素,存放到已排序資料的末尾。 簡單的講,就是每次都把最大或者最小的資料挑選出來,然後依次組成新的序列。 假設有資料{1,4,6,8,3,4,0,2,14},要按照從大到小進行

十大經典排序演算法

1.氣泡排序 演算法思想:a:比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 b:對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。 c

聊聊高併發實現自旋鎖

在聊聊高併發(五)理解快取一致性協議以及對併發程式設計的影響 我們瞭解了處理器快取一致性協議的原理,並且提到了它對併發程式設計的影響,“多個執行緒對同一個變數一直使用CAS操作,那麼會有大量修改操作,從而產生大量的快取一致性流量,因為每一次CAS操作都會發出廣播通知其他處理

JS——排序演算法

一、前言 排序演算法大體可分為兩種:     一種是比較排序,時間複雜度O(nlogn) ~ O(n^2),主要有:氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。     另一種是非比較排序,時間複雜度可以達到O(n),主要有:計數排序,基數排序,桶排

排序演算法:插入排序與堆排序

排序演算法是演算法研究中最基礎的問題,本文針對排序演算法,介紹幾種排序演算法的基本方法、時間複雜度及Java實現等內容。 原址性 :如果輸入陣列中僅有常數個元素需要在排序的過程中儲存在陣列之外,那麼排序演算法就是原址的。         常用排序演算法的執行

程式兵法:Java String 原始碼的排序演算法

摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝! 這是泥瓦匠的第103篇原創 《程式兵法:Java String 原始碼的排序演算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le

python開發電影查詢系統python實現後臺資料

爬蟲也學了很長一段時間了,雖然有些東西還不是很熟悉,但使用python和Django自己做了一個專案,即爬取http://www.bd-film.com/的電影資訊,並將資料儲存到本地,再通過Django做一個查詢入口進行查詢。 我將程式碼實現大致分為三部