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

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

交換排序

氣泡排序

氣泡排序演算法:顧名思義,就是將最重的(最大元素)浮動到最下面,最輕的(最小元素)浮動到最上面.
演算法過程:
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>