各種排序演算法想必大家都不陌生,定義我就不多介紹了,直接寫下自己的一些小結。
快速排序:可以算的上應用最廣的排序演算法。其排序思路是隨機選取乙個數字作為標誌,使得小於它的數在它左邊,大於它的數在它的右邊,然後遞迴對兩邊的資料排序。
歸併排序:應用分之的思想,先將要排序的分為兩列,然後分別進行排序,然後合併到另一
個陣列中,最後再進行把它複製回來。
氣泡排序:是穩定排序,適用於排列的陣列較小而且基本有序,否則時間複雜度太高。
選擇排序:和氣泡排序差不多,差別是冒泡是相鄰的比較,最後選出最大的或者最小的,選
擇排序是選乙個點,然後把遍歷把最小的和這個替換,兩個思想差不多,但選擇排序是不穩定排序,選擇排序理論和實際上是比冒泡要快的。
插入排序:對於部分有序的陣列這種演算法很有用,因為有可能達到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...