常見的一些排序算法,一些是從書上看的,一些則是參考別人的博客,從雜亂無章的博客裏提取實屬不易,多謝理解!
1 插入排序算法
1.1 直接插入排序算法
直接插入排序算法的基本思路:把未排序的數據放在一個已排序好的數組裏面
算法名稱 | 平均時間複雜度 | 最差時間分析 | 空間複雜度 | 穩定度 |
---|---|---|---|---|
直接插入排序 | O(n2) | O(n2) | O(1) | 穩定 |
所有排序方法的 main 函數
#include <iostream>
using namespace std;
//直接插入排序 for
void insertFor(int s[], int n);
//直接插入排序 while
void insertWhile(int s[], int n);
//折半插入排序
void halfInsert(int s[], int n);
//冒泡排序
void bubbleSort(int s[], int n);
int main()
{
int a[11] = {0,8,5,6,3,9,4,2,1,7,10}; //待排序數組
int aLength = sizeof(a)/sizeof(a[0]); //待排序數組的長度
cout<<"before sort"<<endl;
for(int i =0;i<aLength;i++){
cout<<a[i]<<"\t";
}
bubbleSort(a,aLength);
cout<<"\nafter sort"<<endl;
for(int i =0;i<aLength;i++){
cout<<a[i]<<"\t";
}
system("pause");
return 0;
}
//直接插入排序 while
void insertWhile(int a[], int n){
//從i=1開始循環,因爲這裏j是取的i-1
for(int i =1; i<n; i++){
//排好的序列在左邊,拍好的序列的最大的如果比第i個大的話,就排序.
if(a[i]<a[i-1]){
int temp = a[i]; //相當於哨兵,(哨兵:相當於暫存的一個變量)
int j = i - 1;
while(j>=0 && a[j]>temp){ //j>=0防止超出數組邊界. a[j] > a[i]的時候
a[j+1] = a[j];
j--;
}
a[j+1] = temp; //哨兵(暫存的變量)賦給對應位置
}
}
}
1.2 折半插入排序
折半插入排序算法的基本思路:跟直接插入排序一樣,都是把未排序的數據放在一個已排序好的數組裏面.折半插入排序算法相對直接插入排序算法減少了插入位置的尋找比較次數,但是沒有減少元素的移動次數,所以排序的時間複雜度沒有大的變化,基本和直接插入排序保持一致,在數組比較大時可能會減少時間複雜度。
算法名稱 | 平均時間複雜度 | 最差時間分析 | 空間複雜度 | 穩定度 |
---|---|---|---|---|
折半插入排序 | O(n2) | O(n2) | O(1) | 穩定 |
//折半插入排序
void halfInsert(int a[],int n){
int i,j,temp,low,mid,high;
for(i = 1;i<n;i++){
temp = a[i]; // 此時的 temp相當於一個哨兵
low = 0; high = i - 1;
while(low<=high){ //縮小查找範圍
mid = (low+high)/2;
if(a[mid] > temp)
high = mid - 1;
else
low = mid + 1;
}
for(j = i;j>low;j--) //移動次數仍然不變
a[j] = a[j-1];
a[low] = temp;
}
}
2 冒泡排序算法
冒泡排序算法的基本思路:重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來.這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端。
算法名稱 | 平均時間複雜度 | 最差時間分析 | 空間複雜度 | 穩定度 |
---|---|---|---|---|
冒泡排序 | O(n2) | O(n2) | O(1) | 穩定 |
//冒泡排序
void bubbleSort(int a[], int n){
int i,j,temp;
for(i=0;i<n;i++){
for(j=i;j<n;j++){
if(a[i]>a[j]){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
3 選擇排序
選擇排序算法的基本思路:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾.因爲每次都選擇一個最小(最大)的排序,所以有了這個名字
算法名稱 | 平均時間複雜度 | 最差時間分析 | 空間複雜度 | 穩定度 |
---|---|---|---|---|
選擇排序 | O(n2) | O(n2) | O(1) | 不穩定 |
//選擇排序
void selectSort(int a[], int n){
int i,j,min,temp;
for(i=0;i<n-1;i++){
min = i;
//選擇出最小的來
for(j = i+1;j<n;j++){
if(a[j]<a[min]){
min = j;
}
}
//如果最小的和i不相等,換值
if(min!=i){
temp = a[i];
a[i] = a[min];
a[min]= temp;
}
}
}