交換排序(氣泡排序—改進、快速排序)
【氣泡排序(改進版本)】
複雜度:最好情況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個數,將小數放前,大數放後;如此繼續,直至比較最後兩個數,將小數放前,大數放後;至此第一趟結束,使得最後一個數字是最大的了!
排序演算法(氣泡排序、選擇排序、插入排序、歸併排序、快速排序、希爾排序)
氣泡排序 核心: 相鄰元素兩兩比較,大的往後放。第一次比較完畢以