【练习】不同排序算法执行时间比较
生活随笔
收集整理的這篇文章主要介紹了
【练习】不同排序算法执行时间比较
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
插入:
template<typename DataType>void insert(DataType D[], int length) {DataType key;for (int j = 2; j < length; j++) {key = D[j];//先保存D[j]的位置,因為它可能會被替換int i = j - 1;while (i > 0 && D[i] > key) {D[i + 1] = D[i];//如果在j前面的元素比該元素大,將該元素后移動一個位置i--;//i繼續前移進行掃描,直到它剛好大于它前面的元素 小于它后面的元素}D[i+1] = key;//插入剛剛的key值 注意是i+1} }//們將D[0]作為哨兵元素,存儲待排序元素冒泡:
#include<stdio.h> #include<time.h> void swap(int& a, int& b) {int t;t = a;a = b;b = t; } void bubble(int a[], int n) {int i = n - 1;//i是下一趟需要參與排序交換的元素的最大下標while (i > 0) {int minindext = 0;//設置一開始的標志是0for (int j = 0; j < i; j++) {if (a[j + 1] < a[j]) {swap(a[j + 1], a[j]);}minindext = j;//此時為交換之后更小的元素的索引}i = minindext;} } int main() {int a[1000] = { 0 };for (int i = 0; i < 1000; i++){a[i] = rand() % 1000 + 1;}bubble(a, 1000);for (int i = 0; i < 1000; i++){cout<<a[i]<<",";}printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC); }注意:如果不寫swap函數,而是直接在bubble函數中交換兩個數字,發現它們最后并沒有發生交換。
快速排序:
template<class T> int partition(T data[], int p, int r) {int i = p - 1; int j = p;for (j = p; j < r; j++) {if (data[j] <= data[r]) {i++;swap(data[i], data[j]);}}swap(data[i+1], data[r]);return i + 1; } template <class T> void quickSort(T data[], int p, int r) {int position = 0;if (p < r) {position = partition(data, p, r);quickSort(data, p, position - 1);quickSort(data, position+1, r);} }int main() {int a[1000] = { 0 };for (int i = 0; i < 1000; i++){a[i] = rand() % 1000 + 1;}quickSort(a, 0,999);for (int i = 0; i < 1000; i++){cout<<a[i]<<",";}printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC); }易錯點:swap(data[i+1], data[r]);
return i + 1;注意是i+1 ,如果寫成i無法排序
我們設置變量p 和r 表示數組的首尾元素下標,選取數組最右邊的元素為我們第一次排序的劃界元素,記為S[r]。那么我們就需要將S[p],S[p+1],…,S[r–1]組成的序列進行子序列劃分
我們設置變量i=p–1,即最前面元素的前一個,設置變量j = p。反復執行如下步驟:
(1)執行j+1,如果S[j]≤S[r],交換S[i+1]與S[j]的值,i=i+1,j=j+1;如果S[j]≥S[r],i 不變,j=j+1;
(2)到j=r–1 時,停止步驟(1)。
重復執行上述步驟直至停止后,交換S[i+1]與S[r]的值,劃界元素放在了其最終位置上,其左邊的元素均小于等于它,右邊的元素均大于它。
歸并排序:
歸并排序是排序兩個已經排序好了的數組,原數組要先拆成兩個子數組,
注意:一定不能遺漏對于i和j達到a或者b末尾的判斷,否則會出現亂碼。當i到達a的末尾,則遍歷b剩下的數組直接賦給c
跟之前的對比歸并排序時間是最長的。
總結
以上是生活随笔為你收集整理的【练习】不同排序算法执行时间比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: robomaster视觉组代码中的一些函
- 下一篇: 【yolo】yolov3的pytorch