1. 程式人生 > >交換排序(氣泡排序—改進、快速排序)

交換排序(氣泡排序—改進、快速排序)

【氣泡排序(改進版本)】

複雜度:最好情況O(n),最壞O(n^2);演算法穩定

int a[10]={1,3,2,4,6,5,9,7,8,0};
	int flag=9, last_flag=9;
	for(int i=0;i<10;i++)
	{
		flag=last_flag;
		for(int j=0;j<flag;j++)
	   {
		 
	          if(a[j+1]<a[j])    //後一個元素小於前一個,進行交換
		 {
			last_flag=j;  //標記最後一個進行交換的位置,下一次在這個位置之後的元素不再掃描     
	        swap<int>(a[j],a[j+1]);
	         }
	   }
		if(flag==last_flag)   //沒有進行過交換,可以退出
			break;
	}

【快速排序】
思想:
取待排序序列中某個物件為基準(第一個),以基準的大小將序列劃為為左右兩個子序列,左側比基準都小,右側比基準都大。
然後對兩個子序列遞迴使用以上方法,直到序列數目為1。
步驟:1
1、陣列大小小於1,返回這個陣列;
2、從陣列中選一個基準項;
3、建立兩個子陣列,第一個陣列:比基準小的在左邊,第二個陣列:比基準大的在右邊;
4、返回一個數組,由第一個陣列,基準,第二個陣列構成。
複雜度:平均O(nlogn),適合n較大的排序;演算法不穩定

void GroopSort(int low,int high)//將選取的pivotkey不斷交換,把比它小的交換到左邊,比它大的交換到右邊
{
	int i=low;
	int j=high;
	int pivotkey=List[low];
	while(low<high)
	{
		while(low<high&&List[low]<=List[high])
			high--;
	        swap(low,high);
	       while(low<high&&List[low]<=List[high])
		       low++;
	        swap(low,high);
	}
       //遞迴呼叫(迴圈結束的時候,low=high ->pivotkey)
	if(i!=low) GroopSort(i,low-1);
	if(j!=high) GroopSort(high+1,j);
}
改進措施:如果關鍵元素為最小或最大,效率極低。改進選擇第一個、中間、最後一個三個中居中的元素為關鍵碼

【程式碼-備】

#include<iostream>
#include<stdlib.h>
//using namespace std;
template <typename T>
void swap(T &a,T &b); //交換函式,注意這裡遮蔽了“using namespace std”,否則提示有多個過載函式 swap 與引數列表匹配
int main()
{
	int a[10]={1,3,2,4,6,5,9,7,8,0};
	int flag=9, last_flag=9;
	for(int i=0;i<10;i++)
	{
		flag=last_flag;
		for(int j=0;j<flag;j++)
	   {
		 
	          if(a[j+1]<a[j])    //後一個元素小於前一個,進行交換
		 {
			last_flag=j;  //標記最後一個進行交換的位置,下一次在這個位置之後的元素不再掃描     
	        swap<int>(a[j],a[j+1]);
	         }
	   }
		if(flag==last_flag)   //沒有進行過交換,可以退出
			break;
	}
	for(int i=0;i<10;i++)
	{ 
	std::cout<<a[i]<<std::endl;
	} 
	system("pause");
	return 0;
}
template <typename T>
void swap(T &a,T &b)
{
	T temp=a;
	a=b;
	b=temp;
}


相關推薦

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

【氣泡排序(改進版本)】 複雜度:最好情況O(n),最壞O(n^2);演算法穩定 int a[10]={1,3,2,4,6,5,9,7,8,0}; int flag=9, last_flag=9;

演算法導論 第七章:快速排序 筆記快速排序的描述快速排序的效能快速排序的隨機化版本快速排序分析

快速排序的最壞情況時間複雜度為Θ(n^2)。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能很好。它的期望執行時間複雜度為Θ(n lg n),而且Θ(n lg n)中蘊含的常數因子非常小,而且它還是原址排序的。 快速排序是一種排序演算法,對包含n個數的

排序演算法之交換排序氣泡排序快速排序

前言 在前面幾篇部落格中總結了插入排序(直接插入和希爾排序)、選擇排序(直接選擇和堆排序)以及歸併排序,這裡將講下兩種選擇排序演算法——氣泡排序和快速排序。 氣泡排序 基本概念 氣泡排序相對快速排序而言相對簡單。冒泡就如同水裡的魚吐泡泡一樣,剛開始時泡泡很小,但

資料結構演算法 - 交換排序冒泡冒泡改進 and 快速排序

資料結構演算法 - 交換排序(冒泡、快速排序) 交換排序 氣泡排序 快速排序 交換排序 交換排序的核心思想是通過交換位置來對序列進行排序(其實很多排序都會用到交換操作,但它們的思

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

1.氣泡排序,它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。 氣泡排序演算法的原理如下: 比較相鄰的元素。如果第一

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

交換排序:兩兩比較待排序元素,發現倒敘交換。 1、氣泡排序 2、快速排序(遞迴) #include <stdio.h> #define NUM 4 /* 氣泡排序 */ void bubbleSort(int* A) { for (int i = NUM-

(排序演算法)linux c語言實現快速排序氣泡排序改進

 快速排序演算法是對氣泡排序演算法的一種改進,氣泡排序是對單個元素的升降,快速排序是對所有元素的升降,不過這個升降是取了某一個標準的前提下,在本文程式碼中,就以a[i],其實就是以最左邊的元素為參考,比較交換之後,將這個參考元素放到分界的地方,即i的位置。 程式碼如下,裡面有比較詳細的

排序演算法直接插入氣泡排序選擇排序快速排序希爾排序排序歸併排序

main函式 int main() { int data[] = {1,2,6,3,4,7,7,9,8,5}; //bubble_sort(data,10); //select_sort(data,10); Insert_Sort(data,10); fo

幾種排序方法詳解選擇排序氣泡排序插入排序快速排序

由於本帖只是闡述幾種排序方法的原理、如何區分以及編寫幾種排序的簡單程式碼,所以直接給定陣列是 a[ ]={6,2,8,5,1},需要把以上5個數字按升序排列 1. 選擇排序法 (如果不想看解釋分析,直接往後拉看程式碼) 實質: 第一輪:通過對比陣列中前一個元素和後一個元素

小川學習筆記--JAVA一個類實現多種排序氣泡排序快速排序選擇排序插值排序

JAVA氣泡排序、快速排序、選擇排序、插值排序 作者:程式猿劉小川 public static void main(String[] args) //主程式 { int data[] = {5,7,1,0,2,3,4,66,9,8};

JAVA一個類實現多種排序氣泡排序快速排序選擇排序插值排序

JAVA氣泡排序、快速排序、選擇排序、插值排序 作者:程式猿劉小川 public static void main(String[] args) //主程式 { int data[] = {5,7,1,0,2,3

交換排序氣泡排序/快速排序及其優化

交換排序基本思想 兩兩比較待排記錄的關鍵字,一旦發現兩個記錄的次序與排序的要求相逆,則交換這兩個記錄的位置,直到表中沒有逆序的記錄存在為止。 分類 氣泡排序 快速排序(對冒泡的改進) <1>氣泡排序 基本思想:序列中相鄰的兩個元素進行比較,如果前一個元素

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

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

3. 排序通常有多種演算法,如氣泡排序插入排序選擇排序希爾排序歸併排序快速排序,請選擇任意2種用java實現 [分值:20] 您的回答:(空) 簡答題需要人工評分

3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序、快速排序,請選擇任意2種用java實現  [分值:20] 您的回答:(空)  (簡答題需要人工評分) package com.interview; /** * 各種排序演算法 */

C語言中常用排序演算法氣泡排序選擇排序插入排序希爾排序快速排序排序實現比較

以下程式在win10 X64位作業系統,使用VS2017執行驗證可行 排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。 例項1 冒泡法排序 1.前言: 陣列中有N個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法

JS實現排序演算法氣泡排序快速排序

const a = [21, 3, 242, 3432, 13, 13, 123, 4, 35, 22, 1]; // 氣泡排序 // 核心思想:每次比較相鄰的數,如果它們順序錯誤,就把它們交換過來。如同氣泡一樣往後翻滾。 // 最外層的迴圈,每次至少要讓一個元素歸位。 /

必須知道的八大種排序演算法【java實現】 氣泡排序快速排序

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

演算法排序演算法排序氣泡排序快速排序

第一次排序:首先,找一個"基準數",比如5,然後,先從右到左,找到第一個小於基準數的數,4,再從左到右,找到第一個大於基準數的數,9將它們進行交換,5,1,4,26,2,9,5,7,52,21繼續從右到左,尋找小於基準數的數,從左到右,尋找大於基準數的數,並交換,直到兩個相遇,5,1,4,2,26,9,5,7

交換排序氣泡排序~快速排序~+插入排序直接插入排序~希爾排序~

一、氣泡排序 1、基本概念 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。 第一趟:首先比較第1個數和第2個數,將小數放前,大數放後;然後比較第2個數和第3個數,將小數放前,大數放後;如此繼續,直至比較最後兩個數,將小數放前,大數放後;至此第一趟結束,使得最後一個數字是最大的了!

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

氣泡排序           核心:                       相鄰元素兩兩比較,大的往後放。第一次比較完畢以