幾種常用排序算法 (一)
八大常用排序算法詳細分析 包括復雜度:
排序有可以分為以下幾類:
(1)、交換排序:冒泡排序、快速排序
(2)、選擇排序:直接選擇排序、堆排序
(3)、插入排序:直接插入排序、希爾排序
(4)、歸並排序
(5)、基數排序(桶排序)
1.冒泡排序
顧名思義,冒泡排序就是用氣泡從下往上冒的原理,將氣泡(較小或較大的數)依次往前移。
具體做法(升序):設總共有N個元素,則至少需要進行N-1次冒泡。一次排序排序中,若前一個元素大於後一個元素,則交換兩個元素,然後在依次判 斷後面兩兩相鄰元素大小並進行交換。進行完N-1輪冒泡後,排序完成。
C++算法實現:
void Bubble_Sort(int a[],int len)
{
int temp; //臨時變量定義在循環之外,減少重復的定義 釋放 ,提高效率
for (int i = 0; i < len-1 ; ++i)
{
for (int j = 0; j < len - i - 1; ++j)
{
if (a[j]>a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
冒泡排序優化:
若某一次排序中沒有數據進行交換,則排序完成,直接停止排序。所以代碼可以優化。
void Select_Sort(int a[], int len)
{
int temp;
bool flag = true;
while (flag)
{
flag = false;
for (int i = 0; i < len - 1; ++i)
for (int j = i + 1; j < len; ++j)
if (a[i]>a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
flag =false;
}
}
}
2.直接選擇排序
直接選擇排序的原理比較簡單,就是每一次從數列中選擇一個最大(或最小)的元素,將其依次放入數組。
具體做法:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較為止。
C++算法實現:
void Select_Sort(int a[], int len)
{
int temp;
for (int i = 0; i < len - 1; ++i)
for (int j = i + 1; j < len; ++j)
if (a[i]>a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
3.直接插入排序
直接插入排序的基本思想是:從第二個元素開始,每一步把前面的元素排成一個有序的數列,然後把這個元素有序地插入到前面有序的數列中,直到全部數據插入完畢為止。
假設有一組N個元素無序序列 :
(1) 將這個序列的第一個元素視為一個有序序列;
(2) 依次把第2個到第N個元素, 插入到這個有序序列中;
C++算法實現:
void Insert_Sort(int a[],int len)
{
int temp;
for (int i = 1; i < len; ++i)
for (int j = i; j >= 0; --j)
{
if (a[j] >= a[j - 1])
break;
else
{
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
上面這種插入排序還可以進行優化,上面的方法需要通過中間變量進行很多次的交換,我們可以先找到待插入元素應該插入的位置後,將該位置後的元素依次後移,在將待插入元素插入它應該在的位置上,這樣就能減少很多的額外交換操作。
直接插入算法優化:
void Insert_Sort(int a[],int len) { //插入排序優化: int temp; int j; for (int i = 1; i < len;++i) { temp = a[i]; for (j = i; j >= 1 && temp < a[j - 1]; --j) a[j] = a[j - 1]; a[j] = temp; } }
4.希爾排序
希爾排序是一種插入排序算法,又稱作縮小增量排序。是對直接插入排序算法的改進。
其基本思想是:先取一個小於n的整數作為第一個增量,把全部數據分成個組。所有距離為的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;然後,取第二個增量重復上述的分組和排序,直至所取的增量,即所有記錄放在同一組中進行直接插入排序為止。該方法實質上是一種分組插入方法。
C++算法實現:
void Shell_Sort(int a[], int len) { int d = len >> 1; //右移運算符比除法快 int temp; int i,j,k; while (d!=0) { for (i = 0; i < d; ++i) //分成d組 分別排序 2個數一組 在4個數一組 ... 最後合成一組 { for (j = i + d; j < len; j += d) //對第i組排序 { temp = a[j]; for (k = j; k >= i+ d &&temp < a[k - d]; k-=d) { a[k] = a[k - d]; } a[k] = temp; } } d /= 2;//將每組兩兩合並,再進行排序 } }
幾種常用排序算法 (一)