各種排序演算法小結和實現

2021-07-11 17:35:17 字數 3947 閱讀 4936

各種排序演算法想必大家都不陌生,定義我就不多介紹了,直接寫下自己的一些小結。

快速排序:可以算的上應用最廣的排序演算法。其排序思路是隨機選取乙個數字作為標誌,使得小於它的數在它左邊,大於它的數在它的右邊,然後遞迴對兩邊的資料排序。

歸併排序:應用分之的思想,先將要排序的分為兩列,然後分別進行排序,然後合併到另一

個陣列中,最後再進行把它複製回來。

氣泡排序:是穩定排序,適用於排列的陣列較小而且基本有序,否則時間複雜度太高。

選擇排序:和氣泡排序差不多,差別是冒泡是相鄰的比較,最後選出最大的或者最小的,選

擇排序是選乙個點,然後把遍歷把最小的和這個替換,兩個思想差不多,但選擇排序是不穩定排序,選擇排序理論和實際上是比冒泡要快的。

插入排序:對於部分有序的陣列這種演算法很有用,因為有可能達到o(n)複雜度,但是一般的

話還是o(n*n)。

希爾排序:插入排序的變種,我們知道,插入排序它對陣列無序太慢了,而且每次交換移動

一次太慢了,於是設計希爾排序,它每次移動的步長(h)是可變的,一般有乙個那樣的陣列,可以存步 長,然後先h有序,再h/3有序,再h/3/3有序,最後1有序,此處的h/3只是乙個設計,也可以用其它的。希爾排序很快,在資料量很大的情況下,比快速排序也就慢一倍,但是它不需要額外的空間。

堆排序: 對於從很多資料中選擇幾個最大的,不用完全排序就可以選出來,而且消耗的時

間和空間有個折衷。例如說從10億個資料中選10個最大的,只需維護乙個10大小的堆,然後每次新增資料將大於10的用堆刪除就行了,消耗的時間複雜度為 o(n*logm),m為個數大小,此處為10,空間複雜度為m.

基數排序:有兩種,一種從低位到高位,另一種從高位到低位,先按一位的大小排在乙個桶

裡,然後在排後面的位。

廢話不多說,直接上**。

//#include "stdafx.h"

#include

#include

using namespace std;

//氣泡排序

void bubblesort(int

*arr, int

length)

//選擇排序

void selectsort(int

*arr, int

length)

}//網上看的選擇排序的實現,比自己沒有那麼多次交換,人是每次都記錄最小的所在的位置,每次都更新位置,最後找到乙個最小的再交換,比我的優化多了

template void selection_sort(t a, int n)

int min;

for (int i = 0; i < n - 1; ++i)

}//插入排序

void insertsort(int

*arr, int

length)

}return;

}//希爾排序,其實就是插入排序的變種,但是比插入排序快多了

void shellsort(int

*arr, int

length)

h = h / 3;//先h有序,再h/3有序,再h/3/3有序,最後1有序

}}//堆排序

void sink(int

*arr, int start, int end);

void heapsort(int

*arr, int

length)

}void sink(int

*arr, int start, int end)

}//基數排序

int bit(int

*arr, int

length);

void radixsort(int

*arr, int

length)

for (i = 1; i < 10; i++)

for (i = 0; i < length; i++)

for (i = 0; i < length; i++)

arr[i] = tmp[i];

begin *=

10; d--;

}delete tmp;

delete count;

}int bit(int

*arr, int

length)

}return d;

}//歸併排序

void mergesort(int

*arr,int left, int right);

void merge(int* arr, int left, int mid, int right);

void mergesort(int

*arr, int

length)

void mergesort(int

*arr, int left, int right)

*/if (left < right)

}void merge(int* arr, int left, int mid, int right)

int i = left, j = mid + 1,index=left;

/* for (int k = left; k <= right; k++)

*/while (index

<= right)

delete temp;

}//快速排序

void quicksort(int

*arr, int

length, int left, int right);

int partion(int

*arr,int

length, int left, int right);

void quicksort(int

*arr, int

length)

void quicksort(int

*arr,int

length, int left, int right)

int partion(int

*arr, int

length, int left, int right)

srand(time(null));

int i = (rand() % (right+1-left))+left;

swap(arr[i], arr[right]);

int start = left - 1;

intindex = left;

for (index = left; index

<= right; index++)

}start++;

swap(arr[start], arr[right]);

return start;

}void print(int

*arr, int

length)

int _tmain(int argc, _tchar* argv)

;// bubblesort(array, 10);

// mergesort(array, 10);

// quicksort(array, 10);

// insertsort(array, 10);

// shellsort(array, 10);

// heapsort(array, 10);

radixsort(array, 10);

print(array, 10);

return0;}

自己從幾個方面對各個排序演算法效能做乙個比較,因為第一次寫部落格,不會畫**,只好截個圖拿上來了。。。上傳不清晰,可以開啟新的標籤頁看大圖。

總結:對於較大的陣列,且不要求穩定的排序,可以考慮用快速排序;

而對於要求穩定的排序,則考慮歸併排序;

對於較小的陣列,且有序,可以考慮選擇排序和插入排序;

堆排序對於從眾多資料中選擇幾個優的在時間和空間上有個折衷。

各種排序演算法小結

排序演算法是一種基本並且常用的演算法。由於實際工作中處理的數量巨大,所以排序演算法 對演算法本身的速度要求很高。而一般我們所謂的演算法的效能主要是指演算法的複雜度,一般用o方法來表示。在後面我將 給出詳細的說明。對於排序的演算法我想先做一點簡單的介紹,也是給這篇文章理乙個提綱。我將按照演算法的複雜度...

各種插入排序演算法小結

各種插入排序演算法小結 巧若拙直接插入排序是將元素vec i 插入到有序序列vec 0.i 1 依次將vec i 與vec i 1 vec i 2 進行比較,找到插入位置即將vec i 插入,原來位置上的物件向後順移。直接插入演算法 如下 voidinsertsort 1 int vec,int n...

各種排序演算法實現

1 選擇排序 最壞情況 時間複雜度為o n 2 平均時間複雜度o n 2 最好情況 時間複雜度為o n 2 最差空間複雜度 需要輔助空間o 1 不是穩定排序 實現 void swap int a,int b void selectionsort int a,int n if k i swap a i...