一.冒泡排序
时间复杂度: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]<<" ";
}
分析:通过基准元素将数组分成两部分,该过程从两头向中间扫描。每趟将一个元素归位。不稳定的排序。时间主要都耗费在划分操作上。