日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【练习】不同排序算法执行时间比较

發布時間:2024/9/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【练习】不同排序算法执行时间比较 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

插入:

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]的值,劃界元素放在了其最終位置上,其左邊的元素均小于等于它,右邊的元素均大于它。

歸并排序:

void merge(int aa[], int b [], int c[],int lenA, int lenB) {int count = 0;int i = 0, j = 0;while (count < lenA + lenB) {if (aa[i] < b[j]) {c[count] = aa[i];count++;i++;}else {c[count] = b[j];count++;j++;}if (i == lenA) {while (j < lenB) {c[count] = b[j];count++;j++;}}else if(j == lenB){while (i < lenA) {c[count] = aa[i];count++;i++;}}} }void mergesort(int a[], int n) {if (n > 1) //記得要加判斷條件n>1{int* b = new int[n / 2];int* c = new int[n - n / 2];for (int i = 0; i < n / 2; i++) {b[i] = a[i];}int k = n / 2;for (int j = 0; j < n - n / 2; j++) {c[j] = a[j + k];}mergesort(b, n / 2);mergesort(c, n - n / 2);merge(b, c, a, n / 2, n - n / 2);} } int main() {int a[1000] = { 0 };for (int i = 0; i < 1000; i++){a[i] = rand() % 1000 + 1;}mergesort(a, 1000);for (int i = 0; i < 1000; i++){cout << a[i] << ",";}printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC); }

歸并排序是排序兩個已經排序好了的數組,原數組要先拆成兩個子數組,
注意:一定不能遺漏對于i和j達到a或者b末尾的判斷,否則會出現亂碼。當i到達a的末尾,則遍歷b剩下的數組直接賦給c

跟之前的對比歸并排序時間是最長的。

總結

以上是生活随笔為你收集整理的【练习】不同排序算法执行时间比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。