【排序】:氣泡排序以及三種優化
氣泡排序(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次上述操作後,陣列排序即完成。 二、流程
【RHEL7】vsftpd服務程式的三種認證模式
我們使用vsftpd服務程式裡實現FTP協議,重點介紹三種認證模式的配置方法。也就是說,使用vsftpd配置伺服器,使用者可以通過以下三種方式訪問到FTP伺服器: 匿名開放模式:是一種最不安全的認證模式,任何人都可以無需密碼驗證而直接登入到FTP伺服器。 本地使用者模式:是通過Linux系統
【c++】遍歷字串的三種方式
就以:把字串“1234”轉換為整形1234,為例來說明遍歷字串的三種方式: ①常規方式(下標+operator[]) #include <iostream> #include <string> #include <vector> #include <