交換排序(氣泡排序,快速排序)
交換排序
氣泡排序
氣泡排序演算法:顧名思義,就是將最重的(最大元素)浮動到最下面,最輕的(最小元素)浮動到最上面.
演算法過程:
1.迴圈陣列長度length-1次,下標為i.
因為每次迴圈後就會出現一個最大(升序)或最小(降序),只需要比較n-1就行
1.1 在前 length-i個元素中迴圈因為已經有i個已經有序
1.1.2 比較當前元素與後一個元素的大小,如果前者比後者大交換(升序)
//氣泡排序
template <class T>
void BubbleSort(SqList<T> &L){
//非降序排序
T t;
for(int i = 1;i < L.length; ++i){
for(int j = 1;j <= L.length - i; ++j){
if(L.key[j] > L.key[j+1]) {
t = L.key[j];
L.key[j] = L.key[j+1];
L.key[j+1] = t;
}//endif
}//endfor
}//endfor
}
注意:上述演算法會對已經有序的部分也進行比較,這不是我們所想要的,可以想辦法讓已經有序的部分不在比較.
1.可以通過設定標誌位,如果發生了交換,則把較大的已經放在後面了,後面的已經有序,不需要在比較後面一有序的部分了,直接進入下一次迴圈中即可.
2.也可以將上次交換的位置記住,交換後的是有序的,只需要比較交換位置前面的部分即可.
快速排序
首先任意選取一個數據(通常選用陣列的第一個數)作為樞軸,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。
參考大神部落格,大佬部落格
int Partition(int L[],int low,int high){
/*
1.先從後向前分別與樞軸比較,交換,
2.然後從前向後分別與樞軸比較,交換
由於整個過程lwo一直在增加,high一直在減少,所以low<high保證所有元素都與此次所選的樞軸進行了比較,
當low>=high此時在樞軸之前(後)的記錄均不大(小)於它,(函式返回樞軸其所在位置)
但是其他元素之前的相對關係沒有確定,只是確地了其他元素與此次選定的樞軸之間的關係
所以要對樞軸左右的元素遞迴使用此方法
*/
int pivo;//樞軸
L[0] = L[low]; //用子表的第一個記錄作樞軸記錄
pivo = L[low];
while(low < high){ //從表的兩端交替向中間掃描
while(low < high && L[high] >= pivo){
--high;
}//endwhile
L[low] = L[high];//將比樞軸小的移動至低端此元素參與小於樞軸的比較
while(low < high && L[low] <= pivo){
++low;
}//endwhile
L[high] = L[low];//將比樞軸大的記錄移至高階
}//endwhile
L[low] = L[0]; //樞軸記錄到位
return low; //返回樞軸位置
}
void QSort(int L[],int low,int high){
int mid;//接受樞軸位置
if(low < high) {//if low equals high which means all elements had been traversed
mid = Partition(L,low,high);
QSort(L,low,mid-1); //對低子表排序
QSort(L,mid+1,high); //對高子表排序
}//endif
}
相關推薦
排序(洛谷,更新ing)
題目描述 利用快速排序演算法將讀入的N個數從小到大排序後輸出。 P1177 【模板】快速排序 很是傷心,手寫的快排和3路快排都T,歸併排序取A了.... #include<bits/stdc++.
List使用Object的某個屬性進行排序(正序,倒序)
package com.test; public class User { private String name; private Integer orderNo; public String getName() { return name; } publ
演算法入門--堆排序(最大堆,從小到大排序)
#include <stdio.h> #include <stdlib.h> /*由於不會動態獲得當前堆的元素數量heap_size,所以暫時用傳參的方法,但是當多次執行後發現 為了防止錯誤應該把heap_size設定為全域性變數,主函式初始化後,讓
【HDOJ5950】Recursive sequence(矩陣乘法,快速冪)
重點 模板 || getchar() 矩陣 col space pair color 題意:f[1]=a,f[2]=b,f[i]=2f[i-2]+f[i-1]+i^4(i>=3),多組詢問求f[n]對2147493647取模 N,a,b < 2^31 思路:重點
資料結構——交換排序(氣泡排序,快速排序)
一.氣泡排序 1.原理:比較兩個相鄰的元素,將值大的元素交換至右端。 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前
交換排序(氣泡排序,快速排序)
交換排序 氣泡排序 氣泡排序演算法:顧名思義,就是將最重的(最大元素)浮動到最下面,最輕的(最小元素)浮動到最上面. 演算法過程: 1.迴圈陣列長度length-1次,下標為i. 因為每次迴圈後就會出現一個最大(升序)或最小(降序),只需要比較n-1就
各種排序演算法,一步步更新(一),桶排序,氣泡排序,選擇排序,快速排序
部分方法來自我關注的博主 J_小浩子 謝謝 1 桶排序 bucketsort 1 桶排序 #include <stdio.h>//桶排序基本說明 int main(){ int data1[11]={0},tem
交換排序(氣泡排序/快速排序)及其優化
交換排序基本思想 兩兩比較待排記錄的關鍵字,一旦發現兩個記錄的次序與排序的要求相逆,則交換這兩個記錄的位置,直到表中沒有逆序的記錄存在為止。 分類 氣泡排序 快速排序(對冒泡的改進) <1>氣泡排序 基本思想:序列中相鄰的兩個元素進行比較,如果前一個元素
十大排序演算法(氣泡排序,快速排序,插入排序等)
氣泡排序 <1>.比較相鄰的元素。如果第一個比第二個大,就交換它們兩個; <2>.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數; <3>.針對所有的元素重複以上的步驟,除了最後一個; <4>.
排序演算法之交換排序(氣泡排序、快速排序)
前言 在前面幾篇部落格中總結了插入排序(直接插入和希爾排序)、選擇排序(直接選擇和堆排序)以及歸併排序,這裡將講下兩種選擇排序演算法——氣泡排序和快速排序。 氣泡排序 基本概念 氣泡排序相對快速排序而言相對簡單。冒泡就如同水裡的魚吐泡泡一樣,剛開始時泡泡很小,但
各種排序演算法的場景以及c++實現(插入排序,希爾排序,氣泡排序,快速排序,選擇排序,歸併排序)
對現有工作並不是很滿意,所以決定找下一個坑。由工作中遇到排序場景並不多,大都是用氣泡排序,太low,面試又經常問到一些排序演算法方面的東西。剛好讓小學妹郵的資料結構也到了。就把各種排序演算法重新總結一下,以作留存。 排序分為內部排序和外部排序,內部排序是在記憶體中排序。外
三種排序法的練習題(桶排序,氣泡排序,快速排序)
小哼買書的三種解法 題目:要登記買書的同學,人數小於100,每個人報一個ISBN碼,範圍在1~1000;去掉重複的, 並將ISBN碼從小大排列 1、桶排序,時間複雜的都為O(n+m),佔空間大
java實現各種排序演算法(包括氣泡排序,選擇排序,插入排序,快速排序(簡潔版))及效能測試
1、氣泡排序是排序裡面最簡單的了,但效能也最差,數量小的時候還可以,數量一多,是非常慢的。 它的時間複雜度是O(n*n),空間複雜度是O(1) 程式碼如下,很好理解。 public static void bubbleSort(int[] arr)
必須掌握的八種排序(5-6)--氣泡排序,快速排序
5、氣泡排序 (1)基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。 (2)理解圖
交換排序(氣泡排序~快速排序~)+插入排序(直接插入排序~希爾排序~)
一、氣泡排序 1、基本概念 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。 第一趟:首先比較第1個數和第2個數,將小數放前,大數放後;然後比較第2個數和第3個數,將小數放前,大數放後;如此繼續,直至比較最後兩個數,將小數放前,大數放後;至此第一趟結束,使得最後一個數字是最大的了!
桶排序,氣泡排序,快速排序三者比較(例子說名)
再來看一個具體的例子《小哼買書》來看看三個排序在應用上的區別和侷限性。 小哼的學校要建立一個圖書角,老師派小哼去找一些同學做調查,看看同學們都喜歡讀哪些書。小哼讓每個同學寫出一個自己最想讀的書的ISBN號(你知道嗎?每本書都有唯一的ISBN號,不信話你去找本書翻到背面看看)。當然有一些好書會
交換排序之--氣泡排序,快速排序
氣泡排序是一種很經典的排序方式了,當然他也是最簡單的一種交換式排序,氣泡排序的思想很簡單,從前面開始,每每兩個數相比,如果前面的大於後面的則交換位置,知道最後一個數,這樣一輪排序下來,最大的
交換排序(氣泡排序—改進、快速排序)
【氣泡排序(改進版本)】 複雜度:最好情況O(n),最壞O(n^2);演算法穩定 int a[10]={1,3,2,4,6,5,9,7,8,0}; int flag=9, last_flag=9;
九種經典排序演算法詳解(氣泡排序,插入排序,選擇排序,快速排序,歸併排序,堆排序,計數排序,桶排序,基數排序)
綜述 最近複習了各種排序演算法,記錄了一下學習總結和心得,希望對大家能有所幫助。本文介紹了氣泡排序、插入排序、選擇排序、快速排序、歸併排序、堆排序、計數排序、桶排序、基數排序9種經典的排序演算法。針對每種排序演算法分析了演算法的主要思路,每個演算法都附上了虛擬
交換排序(氣泡排序,快速排序)
/* 交換排序:氣泡排序,快速排序 執行環境:VS2010 */ #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h>