1. 程式人生 > >交換排序之--氣泡排序,快速排序

交換排序之--氣泡排序,快速排序

    氣泡排序是一種很經典的排序方式了,當然他也是最簡單的一種交換式排序,氣泡排序的思想很簡單,從前面開始,每每兩個數相比,如果前面的大於後面的則交換位置,知道最後一個數,這樣一輪排序下來,最大的數就跑到了最後面,如此往復,知道全部有序。

   當然上面是最簡單的氣泡排序,他顯然有一個很大的缺點,就是做了很多的重複勞動,當我們開始排序的時候,實際上整個數列就可以分成有序區和無序區,而根據氣泡排序的特性,有序區裡面已經排好序的數是不用的動的,而根據上面的那種演算法,每次一輪排序的時候都是遍歷整個數列,包括有序區,這就十分浪費時間了。所以優化的方式時,每次一輪排序完,都標記一下這個數的位置,即設定一個有序區的標誌位,這樣下次排序的時候只需要遍歷無序區裡面的數了。

   下面是具體的程式碼:

//氣泡排序
	public static int[] BubbleSort(int r[],int n){
		int exchang=n;//有序區標記位,一開始預設是標記在最後一位
		while (exchang!=0) {//還未全部有序時
			int bound=exchang;//將標記位賦給bound
			exchang=0;
			//一輪氣泡排序
			for (int i = 0; i <bound; i++) {//遍歷無序區
				if (r[i]>r[i+1]) {//如果前面比後面打,則交換
					int buffer=r[i];
					r[i]=r[i+1];
					r[i+1]=buffer;
					
					exchang=i;//更新有序區標記位
				}
				
			}
			
		}
		
		return r;
	}

  氣泡排序是一種穩定的排序方式,他的時間複雜度為O(n²)。

同樣屬於交換排序的快速排序是對氣泡排序的一種改進,氣泡排序每次比較都說是相鄰兩個數,也就意味著每一次交換都只移動了一個位置,這就造成了總的比較次數和移動次數比較多,而快速排序則改進了這一缺點,挑一個數為軸,每次挑和他距離最遠的數與他相比,然後交換,這樣小的可以快速被交換到左邊,大的快速被交換到右邊,大大減少了比較次數和移動交換次數。

快速排序的思想是:選擇最左邊的數為軸,先選擇最右邊的數與他比較,如果他大於最右邊的數,則交換位置,此時最左邊的數被交換到最右邊,然後他再找離他最遠的數比較,如果比他大,則交換位置,這樣一輪快速排序下來,比這個軸值大的都跑到他右邊去了,比這個軸值小的都跑到他左邊去了,然後再分別遞迴他左邊和右邊進行快速排序,直到整個數列有序。

快速排序是種不穩定的排序。

相關推薦

Java技術棧(2)排序演算法(冒泡快速排序

1.氣泡排序 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端

交換排序--氣泡排序快速排序

    氣泡排序是一種很經典的排序方式了,當然他也是最簡單的一種交換式排序,氣泡排序的思想很簡單,從前面開始,每每兩個數相比,如果前面的大於後面的則交換位置,知道最後一個數,這樣一輪排序下來,最大的

資料結構——交換排序氣泡排序快速排序

一.氣泡排序 1.原理:比較兩個相鄰的元素,將值大的元素交換至右端。 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前

交換排序氣泡排序快速排序

交換排序 氣泡排序 氣泡排序演算法:顧名思義,就是將最重的(最大元素)浮動到最下面,最輕的(最小元素)浮動到最上面. 演算法過程: 1.迴圈陣列長度length-1次,下標為i. 因為每次迴圈後就會出現一個最大(升序)或最小(降序),只需要比較n-1就

交換排序(氣泡排序快速排序)

/* 交換排序:氣泡排序,快速排序 執行環境:VS2010 */ #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h>

各種排序演算法一步步更新(一)排序氣泡排序選擇排序快速排序

部分方法來自我關注的博主  J_小浩子  謝謝 1 桶排序  bucketsort 1 桶排序 #include <stdio.h>//桶排序基本說明 int main(){     int data1[11]={0},tem

python: 選擇排序氣泡排序插入排序快速排序

def selectSort(lyst): n = len(lyst) for i in range(n - 1): minindex = i for j in range(i + 1, n): if lyst[j] <

Java——實現氣泡排序選擇排序快速排序和二分查詢

在學習C語言時,對排序演算法和二分查詢有一定的理解並進行了實現。 不過打算用Java重新實現一下氣泡排序(Bubble Sort),選擇排序(Selection Sort),快速排序(Quick Sort)和二分查詢(binary_search)。 package pra

十大排序演算法(氣泡排序快速排序插入排序等)

氣泡排序 <1>.比較相鄰的元素。如果第一個比第二個大,就交換它們兩個; <2>.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數; <3>.針對所有的元素重複以上的步驟,除了最後一個; <4>.

常用排序演算法java程式碼實現---快速排序氣泡排序選擇排序

快速排序 public class QuickSort { public void qSort(int[] arr,int left,int right) { if(left>right) { return ; } int i = le

Java語言陣列排序——氣泡排序選擇排序快速排序直接插入排序

今天主要來說下陣列排序的問題,主要介紹的有氣泡排序,選擇排序,快速排序,直接插入排序四種排序: 1.氣泡排序: 主要有原理圖與程式碼解釋; 原理圖借鑑一位老師畫的圖,嘻嘻,老師畫的圖比較好看,就拿來借鑑下: 2.選擇排序 3.快速排序 4.直接插

python: 選擇排序氣泡排序插入排序快速排序

def selectSort(lyst): n = len(lyst) for i in range(n - 1): minindex = i for j in range(i + 1, n): if l

各種排序演算法的場景以及c++實現(插入排序希爾排序氣泡排序快速排序選擇排序歸併排序

對現有工作並不是很滿意,所以決定找下一個坑。由工作中遇到排序場景並不多,大都是用氣泡排序,太low,面試又經常問到一些排序演算法方面的東西。剛好讓小學妹郵的資料結構也到了。就把各種排序演算法重新總結一下,以作留存。 排序分為內部排序和外部排序,內部排序是在記憶體中排序。外

三種排序法的練習題(桶排序氣泡排序快速排序

小哼買書的三種解法 題目:要登記買書的同學,人數小於100,每個人報一個ISBN碼,範圍在1~1000;去掉重複的, 並將ISBN碼從小大排列 1、桶排序,時間複雜的都為O(n+m),佔空間大

排序演算法【動畫】詮釋排序過程【一】【氣泡排序選擇排序插入排序歸併排序快速排序

目錄 語言:c# 1. 氣泡排序(bubble sort) 每一次排序過程: 介紹:氣泡排序是一種最簡單的排序演算法。氣泡排序得名與鍵值較小的元素如同“氣泡”一樣逐漸到序列的頂端。 優點:最簡單的排序演算法, 缺點: 慢,每次只能

插入排序希爾排序選擇排序快速排序氣泡排序歸併排序

插入排序 1、介紹:        簡單插入排序演算法原理:從整個待排序列中選出一個元素插入到已經有序的子序列中去,得到一個有序的、元素加一的子序列,直到整個序列的待插入元素為0,則整個序列全部有序。   在實際的演算法中

經典排序演算法氣泡排序選擇排序直接插入排序希爾排序快速排序歸併排序二分查詢。原理及python實現。

1.氣泡排序 氣泡排序 1.比較相鄰的元素,如果第一個比第二個大(升序),就交換他們兩個 2.對每一對相鄰的元素做同樣的工作,從開始到結尾的最後一對 這步做完後,最後的元素會是最大的數 3.針對所有的元素重複以上的步驟,除了最

java實現各種排序演算法(包括氣泡排序選擇排序插入排序快速排序(簡潔版))及效能測試

1、氣泡排序是排序裡面最簡單的了,但效能也最差,數量小的時候還可以,數量一多,是非常慢的。      它的時間複雜度是O(n*n),空間複雜度是O(1)      程式碼如下,很好理解。 public static void bubbleSort(int[] arr)

必須掌握的八種排序(5-6)--氣泡排序快速排序

5、氣泡排序 (1)基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。 (2)理解圖

氣泡排序快速排序排序歸併排序

1.氣泡排序(1)基本思想:從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大(最小)的資料元素交換到了無序序列的隊尾,從而成為有序序列的一部分;下一次繼續這個過程,直到所有資料元素都排好序。演算法的核心在於:每次通過兩兩比較交換位置。選出剩餘無序序列裡最大(