一.冒泡排序
時間複雜度: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]<<" ";
}
分析:通過基準元素將數組分成兩部分,該過程從兩頭向中間掃描。每趟將一個元素歸位。不穩定的排序。時間主要都耗費在劃分操作上。