排序算法——交換排序

一.冒泡排序

時間複雜度:O(n2

空間複雜度:O(1)

示例代碼:

#include<iostream>
using namespace std;

void BubbleSort(int a[],int n){
    //冒泡排序,從小到大將數組進行排序
    //n爲數組長度
    int i,j,k;
    for(i=0;i<n-1;i++){
        for(j=n-1;j>i;j--){
            if(a[j]<a[i]){
                k=a[j];
                a[j]=a[i];
                a[i]=k;
            }
        }
    }
}

int main(){
    int a[]={9,1,2,3,6,4,5,0,8,7};
    BubbleSort(a,10);
    for(int i=0;i<10;i++)
        cout<<a[i]<<"  ";
}

分析:很簡單的一種排序算法,可是效率不是特別高。使用兩個for循環,使得元素一個一個得往上“浮”。每趟產生的有序區中元素都已經歸位。穩定的排序,相同大小的並不交換順序。


二.快速排序

時間複雜度:O(nlog2n),最壞爲O(n2

空間複雜度:O(log2n),因爲使用了遞歸,遞歸樹的高度最壞爲O(n),當分割成的兩個子序列長度接近時,遞歸樹的高度爲O(log2n)。

示例代碼:

#include<iostream>
using namespace std;

void QuickSort(int a[],int s,int t){
    //對a[s]到a[t]之間的元素進行排序
    int i=s,j=t,k=a[s];//k作爲基準,開始以第一個元素作爲基準
    if(s<t){
        //至少有兩個元素
        while(i!=j){
                //直到i=j,不斷循環,以基準進行分類
            while(j>i&&a[j]>k)//從右往左的掃描,如果比基準小,就換到左面
                j--;
            a[i]=a[j];//交換
            while(i<j&&a[i]<k)//從左往右的掃描,如果比基準大,就放到右邊
                i++;
            a[j]=a[i];
        }
        a[i]=k;//循環完一遍,i=j的位置就是上次循環的基準元素的位置
        QuickSort(a,i+1,t);//對右邊遞歸
        QuickSort(a,s,i-1);//對左邊遞歸
    }

}
int main(){
    int a[]={9,1,2,3,6,4,5,0,8,7};
    QuickSort(a,0,9);
    for(int i=0;i<10;i++)
        cout<<a[i]<<"  ";
}

分析:通過基準元素將數組分成兩部分,該過程從兩頭向中間掃描。每趟將一個元素歸位。不穩定的排序。時間主要都耗費在劃分操作上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章