排序演算法作為常用的基本演算法,今天就來總結一下各種經典排序演算法,這裡只貼出**,對演算法的文字描述可以在課本或其它部落格上找到很多詳盡的敘述,這裡直接上**而不是常見演算法書上的偽**,希望對正在努力學資料結構與演算法的朋友們有幫助:
1:氣泡排序
void bubblesort(t a, int n)
}if(!isswap)
}}
2:插入排序
// 類似於撲克牌的安插
template
void insertionsort(t *a, int n)
a[in] = temp;
}}
3:選擇排序
// 與氣泡排序演算法類似,不過選擇排序是每輪選最小的,對目前最小的做標記,最後才交換,將最小的放在前面
void selectionsort(int
array, const
int len) // o(n*n)
swap(array, min, i);}}
}
4:歸併排序
#include
using
namespace
std;
void merge(int a, int tmp, int lpos, int rpos, int rend)
while(lpos <= lend)
tmp[tmppos++] = a[lpos++];
while(rpos <= rend)
tmp[tmppos++] = a[rpos++];
for(i = 0; ivoid msort(int a, int tmp, int low, int high)
}void mergesort(int a, int len)
}void print(int a, int n)
cout
<< endl;
}}int main()
; print(a, 10);
mergesort(a, 10);
print(a, 10);
cout
<< endl;
return
0;}
5:快速排序
使用了三次取中的方法選取樞軸,避免了當待排序資料基本有序時退化為氣泡排序的情況:
#include
using
namespace
std;
/*三次取中作為樞軸,避免了當排序陣列有序時時間複雜度退化為o(n^2)的情況
注:stl中sort的實現當元素個數少於10個時,呼叫插入排序
參考**:
*/void swap(int& a , int& b)
/*函式作用:取待排序序列中low、mid、high三個位置上資料,選取他們中間的那個資料作為樞軸*/
int selectpivotmedianofthree(int arr,int low,int high)
if (arr[low] > arr[high])//目標: arr[low] <= arr[high]
if (arr[mid] > arr[low]) //目標: arr[low] >= arr[mid]
//此時,arr[mid] <= arr[low] <= arr[high]
return arr[low];
//low的位置上儲存這三個位置中間的值
//分割時可以直接使用low位置的元素作為樞軸,而不用改變分割函式了
}void qsort(int a, int low, int high)
selectpivotmedianofthree(a, low, high);
if(low >= high)
int first = low;
int last = high;
int key = a[first];
while(first < last)
a[first] = a[last];
while(first < last && a[first] <= key)
a[last] = a[first];
}a[first] = key;
qsort(a, low, first-1);
qsort(a, first+1, high);
}int main()
; for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
cout
<< endl;
qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);
for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
cout
<< endl;
return
0;}
6:希爾排序
void shellsort(int
array, int len) // o(n*n)
array[k] = temp;
}}while( gap > 1 );
}
7:堆排序
也是top-k問題的一種解法:
#includeusing namespace std;
void heapadjust(int a, int n, int
size)}/*
這裡的k指的是top-k問題嗎,當k為size或(size-1)時,則是純正完整的堆排序過程;
kvoid heapsort(int a, int
size, int k)
}void print(int a, int n)
}int main()
; heapsort(a, 16, 16);
print(a, 16); // 全部進行排序
cout << endl;
int b[6] = ;
heapsort(b, 6, 3); // 取top3,陣列最後三個數是前三大的
print(b, 6);
cout << endl;
int c[6] = ;
heapsort(c, 6, 2); // top2
print(c, 6);
cout << endl;
}
參考資料: 常見排序演算法
一.選擇排序 1.概念 每次從無序的子陣列裡面選擇最小的數,放在有序區的後面 既與無序區的首元素交換 不穩定排序 時間複雜度o n 2 輔助儲存o 1 2.實現 int selection sort int a,int len len為陣列元素個數 二.氣泡排序 1.概念 重複訪問數列n 1次,每次...
常見排序演算法
1 插入排序 直接插入排序,是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表。初始 38 65 27 76 13 i 1 13 選13為監視哨並假設為乙個有序序列 i 2 13 38 待插入元素38 13 i 3 13 38 65 待插入...
常見排序演算法
最優 o n 最差 o n 2 平均 o n 2 空間 o 1 穩定排序 插排的思路是保證遍歷到每個元素時,該元素前面的序列都是有序的。基於這個前提,我們將遍歷到的新元素和它前面的序列相比對,然後將這個元素插入到適當的位置,使得這個包含新元素的序列也是有序的。雖然外層遍歷只要o n 時間,但是因為找...