/*
常用排序演算法分析
*/void swap(int& x,int& y)}/*
氣泡排序
時間複雜度為o(n^2)
兩兩比較,交換,每次內層迴圈在未排序序列中找出最大值放到已排序中
對於部分有序的序列來說,效率較高
穩定*/
void bubble_sort(int* arr,int start,int end)
} if(pos != -1)else }}
/*選擇排序
o(n^2)
在未排序序列中查詢最大或最小值,放在已排序序列的尾部或頭部
不穩定*/
void select_sort(int* arr,int start,int end)
} swap(arr[maxnumpos],arr[start + end - i]); }}
/*插入排序
o(n^2)
從未排序序列中取乙個數值插入已排序序列中對應位置
穩定*/
void insert_sort(int* arr,int start,int end)
} arr[pos] = num; }}
/*快速排序
nlog(n)
分治法不穩定
*/void quick_sort(int* arr,int left,int right)
arr[dw] = key;
quick_sort(arr,left,dw - 1);
quick_sort(arr,dw + 1,right);}/*
桶排序o(n)
需要使用輔助空間,在集合範圍較小的情況下推薦使用,效率很高
穩定*/
void bucket_sort(int* bucket,int* arr,int start,int end)
if(minnum > arr[i])
} for(int i = start; i <= end; i++)
int ncount = start;
for(int i = 0; i <= max_length; i++)
if(ncount > end)
break; }}
/*歸併排序
nlog(n)
需要輔助空間
穩定*/
void merge_cal(int* total,int* arr,int start,int end)
else
} while(firststart <= firstend)
while(secondstart <= secondend)
for(int i = 0; i < ncount; i++)
}void merge_sort(int* total,int* arr,int start,int end)
之前認為冒泡與插入選擇的時間複雜度都是o(n^2),所以以為使用哪一種都是一樣的,但是通過對比發現,氣泡排序是最慢的一種。
橫座標為隨機資料量,縱座標為排序時間ms
從圖中看出氣泡排序是最慢的,插入和選擇所用的時間差不多,快速排序在這點資料量面前所用時間幾乎為0.下面是具體資料。
在將快速排序,歸併排序,和桶排序一起比較
可以看出,桶排序的時間複雜度幾乎為0,快速排序與歸併排序差不多,但是快速排序比歸併排序要快一些,造成這樣的原因可能是因為,快速排序是在原資料上直接修改,而歸併排序不是且需要一次拷貝。下面是具體資料,
從上面對比可以看出,如果只論時間複雜度來說一定是桶排序獲勝,如果論時間與空間複雜度還是快速排序更勝一籌。
但是快速排序是不穩定的,而桶排序與歸併排序是穩定的。桶排序所耗空間複雜度取決於資料的範圍而非資料量,適用於資料範圍較小的排序,比如1000萬學生的成績排序。而歸併排序所耗空間複雜度為o(n)與資料量相關。所以在使用還是要考慮場景和需求。
排序演算法總結對比
0.十大經典排序演算法 1.排序演算法分類 非線性時間比較類排序 通過比較來決定元素間的相對次序,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排...
0 演算法總結對比 更新中
排序過程元素位置移動的程度 演算法移動的時間衡量 通過演算法遍歷元素個數體現 演算法是否需要額外的空間 名稱效能 演算法思想 演算法型別 時間複雜度 平均時間複雜度 空間複雜度 穩定性適用資料場景 選擇排序 一般元素移位節約空間消耗時間 比較型o n o n o 1 不穩定不常用 氣泡排序 一般比較...
排序演算法對比
2019 september 07 排序演算法對比 排序演算法 平均時間複雜度 最好情況 最壞情況 空間複雜度 原址排序 比較排序 穩定插入排序 theta left n right theta left n right theta left n right mathbf left 1 right ...