1. 程式人生 > >排序(氣泡排序與快速排序)

排序(氣泡排序與快速排序)

1、氣泡排序(Bubble Sort)

將n個記錄進行氣泡排序的主要方法:

第一趟:將第一個記錄與第二個記錄比較,再將第二個與第三個比較(如果逆序就交換)......直到第n-1個與第n個比較得出:第n個記錄最大(最小);

第二趟:將第一個記錄與第二個記錄比較,再將第二個與第三個比較(如果逆序就交換)......直到第n-2個與第n-1個比較得出:第n-1個記錄最大(最小);

第三趟:將第一個記錄與第二個記錄比較,再將第二個與第三個比較(如果逆序就交換)......直到第n-3個與第n-2個比較得出:第n-2個記錄最大(最小);

……

第n-1趟:將一個記錄與第二個記錄比較(如果逆序就交換)將最小(最大)的記錄排在第一位。

void BubbleSort(int arr[],int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
        for(j=1;j<n-i;j++)
        if(arr[j-1]>arr[j])
        {
        t=arr[j-1];
        arr[j-1]=arr[j];
        arr[j]=t;
        }
}
氣泡排序是一種穩定的排序方法,當被操作的序列已有序,那個只要做一次排序,比較次數為(n-1),但如果是逆序,那個就是比較n*(n-1)/2次。這樣時間複雜度為O(n^2),空間複雜度為O(1),可以看出,氣泡排序是一種穩定排序。

2、快速排序(Quick Sort)

快速排序又叫分割槽交換排序,是對氣泡排序的一種改進。快速排序的基本思想是:通過一次排序將原序列劃分成獨立的兩個部分,前一部分的記錄全小於關鍵字,後一個部分全大於關鍵字,然後再對這兩部分進行劃分成兩個獨立的部分,一邊小,一邊大,直到整個序列有序為止。可以看出,會使用到分治法。
int Partition(int arr[],int low,int high)
{
    int i,j,key;
    i=low;
    j=high;
    key=arr[low];
    while(i<j)
    {
        while(i<j&&arr[j]>=key) j--;
        if(i<j) arr[i++]=arr[j];
        while(i<j&&arr[i]<key) i++;
        if(i<j) arr[j--]=arr[i];

    }
    arr[i]=key;
    return i;
}

void QuickSort(int arr[],int low,int high)
{
    if(low<high)
    {
        int key= Partition(arr,low,high);
        QuickSort(arr,low,key-1);
        QuickSort(arr,key+1,high);
    }
}
將分治的部分整合在排序功能函式中(這樣做或許會造成排序出錯):
void QuickSort(int arr[],int low,int high)
{
    int i,j,key;
    if(low<high)
    {
        i=low;
        j=high;
        key=arr[low];
         while(i<j)
        {
        while(i<j&&arr[j]>=key) j--;
        if(i<j) arr[i++]=arr[j];
        while(i<j&&arr[i]<key) i++;
        if(i<j) arr[j--]=arr[i];
        }
        arr[i]=key;
         QuickSort(arr,low,i-1);
        QuickSort(arr,i+1,high);
    }
}
快速排序是一種不穩定的排序方法,平均時間複雜度為O(nlogn),空間複雜度O(logn)。但是當序列基本有序時,快排的比較數次就是增多,慢慢退化成氣泡排序,時間複雜度就是降為O(n^2),在排序過程中,有可能改變相等元素的原始位置,所以快速排序是一種不穩定的排序。

相關推薦

陣列排序交換法選擇法

交換法與選擇法降序排序 交換法 交換法對陣列陣列進行排序的基本思路 就是先讓陣列(n個數)中的最左邊的一個數(用i=0代表)與其右邊的每一個數(從j=i+1開始)依次(j++)進行比較,若遇到比其大的數(score[j]>score[i]),則將較

排序氣泡排序快速排序

1、氣泡排序(Bubble Sort) 將n個記錄進行氣泡排序的主要方法: 第一趟:將第一個記錄與第二個記錄比較,再將第二個與第三個比較(如果逆序就交換)......直到第n-1個與第n個比較得出:第n個記錄最大(最小); 第二趟:將第一個記錄與第二個記錄比較,再將第二個

(排序演算法)linux c語言實現快速排序氣泡排序的改進版

 快速排序演算法是對氣泡排序演算法的一種改進,氣泡排序是對單個元素的升降,快速排序是對所有元素的升降,不過這個升降是取了某一個標準的前提下,在本文程式碼中,就以a[i],其實就是以最左邊的元素為參考,比較交換之後,將這個參考元素放到分界的地方,即i的位置。 程式碼如下,裡面有比較詳細的

小川學習筆記--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個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前

排序演算法之交換排序氣泡排序快速排序

前言 在前面幾篇部落格中總結了插入排序(直接插入和希爾排序)、選擇排序(直接選擇和堆排序)以及歸併排序,這裡將講下兩種選擇排序演算法——氣泡排序和快速排序。 氣泡排序 基本概念 氣泡排序相對快速排序而言相對簡單。冒泡就如同水裡的魚吐泡泡一樣,剛開始時泡泡很小,但

交換排序氣泡排序~快速排序~+插入排序直接插入排序~希爾排序~

一、氣泡排序 1、基本概念 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。 第一趟:首先比較第1個數和第2個數,將小數放前,大數放後;然後比較第2個數和第3個數,將小數放前,大數放後;如此繼續,直至比較最後兩個數,將小數放前,大數放後;至此第一趟結束,使得最後一個數字是最大的了!

交換排序氣泡排序—改進、快速排序

【氣泡排序(改進版本)】 複雜度:最好情況O(n),最壞O(n^2);演算法穩定 int a[10]={1,3,2,4,6,5,9,7,8,0}; int flag=9, last_flag=9;

交換排序氣泡排序快速排序

交換排序 氣泡排序 氣泡排序演算法:顧名思義,就是將最重的(最大元素)浮動到最下面,最輕的(最小元素)浮動到最上面. 演算法過程: 1.迴圈陣列長度length-1次,下標為i. 因為每次迴圈後就會出現一個最大(升序)或最小(降序),只需要比較n-1就

1.交換排序氣泡排序快速排序

交換排序的基本思想:兩兩比較關鍵字,當兩個記錄的次序相反時進行交換,直到完成排序為止。 (1)氣泡排序 基本思想:相鄰關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上“漂浮”直至“水面

排序演算法---之交換排序氣泡排序&快速排序-左右指標法,挖坑法,前後指標法

                                                      排序演算法----交換排序(氣泡排序&快速排序) 一、排序演算法分為: 1.插入排序(直接插入排序&希爾排序)      2.選擇排序(直接選

交換排序氣泡排序快速排序

交換排序:根據序列中兩個元素關鍵字的比較結果來對換這兩個記錄在序列中的位置。 氣泡排序的基本思想:假設待排序元素表長為size,從前往後(或從後往前)兩兩比較相鄰元素的值,若為逆序(即arr[j]>arr[j+1]),則交換他們,直至整個元素表有序。 // 氣

資料結構:交換排序氣泡排序快速排序

1.氣泡排序,它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。 氣泡排序演算法的原理如下: 比較相鄰的元素。如果第一

排序:交換排序氣泡排序快速排序

交換排序:兩兩比較待排序元素,發現倒敘交換。 1、氣泡排序 2、快速排序(遞迴) #include <stdio.h> #define NUM 4 /* 氣泡排序 */ void bubbleSort(int* A) { for (int i = NUM-

排序算法入門之快速排序java實現

大小 ava 相對 其余 時間 個數 技術分享 算法 元素交換   快速排序也是一種分治的排序算法。快速排序和歸並排序是互補的:歸並排序將數組分成兩個子數組分別排序,並將有序的子數組歸並以將整個數組排序,會需要一個額外的數組;而快速排序的排序方式是當兩個子數組都有序

小橙書閱讀指南——快速排序和三向切分快速排序

指針 rri 位置 容易 情況 相關鏈接 created style 了解 算法描述:快速排序是一種分治的排序算法。它將數組分為兩個子數組,並將兩部分獨立的排列。快速排序和歸並排序是互補的:歸並排序將數組分成兩個子數組分別排序,並將子數組歸並以將整個數組排序;而快速排序將數

多條資料按照某條資料中某個共有屬性排序氣泡排序

多條資料按照某條資料中某個共有屬性排序(氣泡排序) 注意:此例是根據學生成績由高到低排序,僅供自己專案中提供思路,勿擾。 1、新建一個專案,在專案中新增一個Students類,用於儲存學生的基本資訊。 Students 類: class Students {

快速排序三數中值法

package sort; public class QuickSort {//快速排序 public static void main(String[] args) { int[] array = {39,44,1,0,8,66,23,67,9,15,100,70,22,3,6,54