1. 程式人生 > >【排序】:氣泡排序以及三種優化

【排序】:氣泡排序以及三種優化

氣泡排序(BubbleSort)

一般氣泡排序的寫法

//假設排序arr[] = { 1, 3, 4, 2, 6, 7, 8, 0 };
void BubbleSort(int arr[],int len)
{
    int i = 0;
    int tmp = 0;
    for (i = 0; i < len - 1; i++)//確定排序趟數
    {
        int j = 0;
        for (j = 0; j < len - 1 - i; j++)//確定比較次數
        {
            if (arr[j]>arr[j + 1
]) { //交換 tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } }

優化一

假設我們現在排序ar[]={1,2,3,4,5,6,7,8,10,9}這組資料,按照上面的排序方式,第一趟排序後將10和9交換已經有序,接下來的8趟排序就是多餘的,什麼也沒做。所以我們可以在交換的地方加一個標記,如果那一趟排序沒有交換元素,說明這組資料已經有序,不用再繼續下去。

程式碼實現:

void BubbleSort(int arr[], int len)
{
    int i = 0;
    int tmp = 0;
    int flag = 0;
    for (i = 0; i < len - 1; i++)//確定排序趟數
    {
        int j = 0;
        for (j = 0; j < len - 1 - i; j++)//確定比較次數
        {
            flag=0;
            if (arr[j]>arr[j + 1])
            {
                //交換
tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 1;//加入標記 } } if (flag == 0)//如果沒有交換過元素,則已經有序 { return; } } }

優化二

優化一僅僅適用於連片有序而整體無序的資料(例如:1, 2,3 ,4 ,7,6,5)。但是對於前面大部分是無序而後邊小半部分有序的資料(1,2,5,7,4,3,6,8,9,10)排序效率也不可觀,對於種類型資料,我們可以繼續優化。既我們可以記下最後一次交換的位置,後邊沒有交換,必然是有序的,然後下一次排序從第一個比較到上次記錄的位置結束即可。

這裡寫圖片描述

程式碼實現:

void BubbleSort(int arr[], int len)
{
    int i = 0;
    int tmp = 0;
    int flag = 0;
    int pos = 0;//用來記錄最後一次交換的位置
    int k = len - 1;
    for (i = 0; i < len - 1; i++)//確定排序趟數
    {
        pos = 0;
        int j = 0;
        for (j = 0; j < k; j++)//確定比較次數
        {
            flag = 0;
            if (arr[j]>arr[j + 1])
            {
                //交換
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
                flag = 1;//加入標記
                pos = j;//交換元素,記錄最後一次交換的位置
            }
        }
        if (flag == 0)//如果沒有交換過元素,則已經有序
        {
            return;
        }
        k = pos;//下一次比較到記錄位置即可
    }
}

優化三

優化二的效率有很大的提升,還有一種優化方法可以繼續提高效率。大致思想就是一次排序可以確定兩個值,正向掃描找到最大值交換到最後,反向掃描找到最小值交換到最前面。例如:排序資料1,2,3,4,5,6,0

這裡寫圖片描述

程式碼實現:

void BubbleSort(int arr[], int len)
{
    int i = 0;
    int j = 0;
    int n = 0;//同時找最大值的最小需要兩個下標遍歷
    int flag = 0;
    int pos = 0;//用來記錄最後一次交換的位置
    int k = len - 1;
    for (i = 0; i < len - 1; i++)//確定排序趟數
    {
        pos = 0;
        flag = 0;
        //正向尋找最大值
        for (j = n; j < k; j++)//確定比較次數
        {
            if (arr[j]>arr[j + 1])
            {
                //交換
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
                flag = 1;//加入標記
                pos = j;//交換元素,記錄最後一次交換的位置
            }
        }
        if (flag == 0)//如果沒有交換過元素,則已經有序,直接結束
        {
            return;
        }
        k = pos;//下一次比較到記錄位置即可
        //反向尋找最小值
        for (j = k; j > n; j--)
        {
            int tmp = arr[j];
            arr[j] = arr[j - 1];
            arr[j - 1] = tmp;
            flag = 1;
        }
        n++;
        if (flag == 0)//如果沒有交換過元素,則已經有序,直接結束
        {
            return;
        }
    }
}

相關推薦

排序氣泡排序以及優化

氣泡排序(BubbleSort) 一般氣泡排序的寫法 //假設排序arr[] = { 1, 3, 4, 2, 6, 7, 8, 0 }; void BubbleSort(int arr[],

Hibernate 模板註入以及狀態

個人 bsp cto 普通 綁定 使用 nbsp 狀態 註入 本文只供個人復習閱讀,如有錯誤還望大大指點 普通情況下的sessionFactory生成如圖(借用其他大大的圖),而web的Dao層開發,可以用Spring註入sessionfactory 後續章節再詳細

python資料結構與演算法排序演算法氣泡排序、快速排序

以下排序演算法,預設的排序結果是從小到大。 一.氣泡排序: 1.氣泡排序思想:越大的元素,就像越大的氣泡。最大的氣泡才能夠浮到最高的位置。 具體來說,即,氣泡排序有兩層迴圈,外層迴圈控制每一輪排序中操作元素的個數——氣泡排序每一輪都會找到遍歷到的元素的最大值,並把它放在最後,下一輪排序時

其他PHP氣泡排序

目的: 對一組資料,比較相鄰資料的大小,將值小資料在前面,值大的資料放在後面。   原理(從後往前): 1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點

排序冒泡以及優化

/** * 冒泡以及三種優化 * */ public class One { /** * 經典 * */ public static void one(int[] arr) { for(int i=0;i<arr.

排序圖解氣泡排序

一、思想 對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟都會將最小或最大的元素交換的頂端,最終達到完全有序,例如,升序排列,就是最大的元素移動後面的過程。 二、圖解過程 冒泡排序升序排列的整個過程如下圖,陣列共包含6個元素,第一輪將6個元素中最大的

基礎演算法3插入排序InsertionSort

插入排序: 插入排序類似於大多數人安排撲克牌的方式: 從你手中的一張牌開始, 選擇下一張卡並將其插入到正確的排序順序中, 對所有的卡重複上一步。 分析: 外迴圈執行N-1

個簡單排序演算法氣泡排序、選擇排序、插入排序

以下從基礎開始,逐步詳細複習各個排序演算法。先從三個最基礎最簡單的排序演算法開始。他們分別是氣泡排序、選擇排序、插入排序。以下都是java程式碼,並且認為升序是有序。一、氣泡排序1、程式碼public class Main{//氣泡排序 public static void

經典排序氣泡排序

經典排序演算法 - 氣泡排序Bubble sort 原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換, 這樣一趟過去後,最大或最小的數字被交換到了最後一位, 然後再從頭開始進行兩兩比較交換,直到倒數第二位時結束,其餘類似看例子 例子為從小到大排序,

排序演算法氣泡排序、插入排序和快速排序

筆試中經常有排序的演算法題,關於氣泡排序,這裡就不再細講了,具體方法很多種,直接上程式碼: //氣泡排序 (個人實現方法)         static void BubbleSort(int[] dataArray) {     &n

簡單的陣列排序演算法氣泡排序和直接選擇排序(升序)

氣泡排序的基本思想是:面對一排資料,先從前往後兩兩比較,如果前一個數比後一個數大就交換兩者的順序,即第一個數和第二個數比,第二個數和第三個數比,……,倒數第二個數和最後一個數比,這樣一輪下來以後最大的數就排到最後;接著把除去最大的數的該組資料進行同樣的操作,直至

視覺化的排序氣泡排序、雞尾酒排序和快速排序

氣泡排序 氣泡排序的視覺化圖: 氣泡排序的概念:氣泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直至沒有反序的記錄為止。因為按照該演算法,每次比較會將當

排序演算法氣泡排序(帶標記)

查詢排序演算法時,找到一個種帶標記的氣泡排序演算法,它的優勢是對於後部已經排好序的的數列,節省了繼續向後比較的操作。 帶標記的氣泡排序演算法:在一次排序中,標記出最後一次進行交換元素的位置,在下次排序中,只需要比較到這個標記位置,因為後面的元素已經排好序。 C++實現 #

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

幾種排序演算法分析:   氣泡排序:   氣泡排序的方法排序速度比較慢。   思路:進行n-1排序,第一次排序先找出最小的數字,放在第一個位置,然後在剩餘的數字中再找出最小的數字,放在第二個位置上,依次類推,可以排出所有的數字。   當然也可以從大到小的排序。   例如

漫步IOS--部分排序氣泡排序、選擇排序和快速排序

1 氣泡排序 氣泡排序的思路:從序列的一頭開始,每次比較相鄰的兩個數,將大的往後移.當走到序列結尾的時候,最後一個即是最大的;然後再從頭開始比較,只是這次比較到倒數第二個就好,因為最後一個已經確定是最大了。如此往復,直到沒有需要比較的元素為止。個人表述有限,可參考維基百

java排序演算法氣泡排序、選擇排序、插入排序

/** * 氣泡排序 * * 原理 是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換, * * 這樣一趟過去後,最大或最小的數字被交換到了最後一位, * * 然後再從頭開始進行兩兩比較交換,直到倒數第二位時結束 * * @author daopinz * */

排序演算法氣泡排序、插入排序、選擇排序、快速排序對比

package com.test; public class T { public static void main(String[] args) { long start = System.currentTimeMillis(); int[] arr1 =

排序演算法氣泡排序

一、原理 對於長度為n的陣列,我們對陣列的前n,n-1,n-2,n-3,…,0個數組進行“冒泡”,即比較前一個數據與後一個數據的大小,若前者更大,交換位置。這樣一來,最大的資料便可以移到陣列的末位置。進行n-1次上述操作後,陣列排序即完成。 二、流程

RHEL7vsftpd服務程式的認證模式

我們使用vsftpd服務程式裡實現FTP協議,重點介紹三種認證模式的配置方法。也就是說,使用vsftpd配置伺服器,使用者可以通過以下三種方式訪問到FTP伺服器: 匿名開放模式:是一種最不安全的認證模式,任何人都可以無需密碼驗證而直接登入到FTP伺服器。 本地使用者模式:是通過Linux系統

c++遍歷字串的方式

就以:把字串“1234”轉換為整形1234,為例來說明遍歷字串的三種方式: ①常規方式(下標+operator[]) #include <iostream> #include <string> #include <vector> #include <