氣泡排序、插入排序、選擇排序、歸併排序、快速排序
下面提供原始碼檔案,執行環境VS,我用的VS2017。
// sort.cpp: 定義控制檯應用程式的入口點。 // //#define _CRT_SECURE_NO_WARNINGS #define INC_03_SELECTION_SORT_DETECT_PERFORMANCE_SORTTESTHELPER_H #include "stdafx.h" #include<vector> #include<string> #include<iostream> #include"CRandom.h" using namespace std; //基礎排序演算法 //1.氣泡排序 template<typename T> vector<T> bubbleSort(vector<T> &arr) { for (int i = 0; i < arr.size(); i++) { for (int j = i + 1; j < arr.size(); j++) if (arr[i] > arr[j]) swap(arr[i], arr[j]); } return arr; } //2.插入排序 template<typename T> vector<T> insertSort(vector<T> &arr) { for (int i = 0; i < arr.size(); i++) { for (int j = i + 1; j > 0 && j < arr.size(); j--) { if (arr[j] < arr[j - 1]) { swap(arr[j], arr[j - 1]); } } } return arr; } //3.選擇排序 template<typename T> vector<T> selectionSort(vector<T> &arr) { for (int i = 0; i < arr.size(); i++) { int minIndex = i; for (int j = i + 1; j < arr.size(); j++)//找到最小的索引值,只交換一次 if (arr[j] < arr[minIndex]) minIndex = j; swap(arr[i], arr[minIndex]); } return arr; } //4.歸併排序****************************************** template<typename T> vector<T> mergeSort(vector<T> &arr) { _mergeSort(arr, 0, arr.size() - 1); return arr; } template<typename T> void _mergeSort(vector<T> &arr, int start, int end) { if (end - start < 1) return; int mid = (end + start) / 2; _mergeSort(arr, start, mid); _mergeSort(arr, mid+1, end); mmerge(arr, start, mid, end); } template<typename T> void mmerge(vector<T> &arr, int start, int mid, int end) { int i = 0; vector<T> temp;//先將陣列複製一份 while (i <= end - start) { temp.push_back(arr[i + start]); i++; } for (int i = start, j = 0, k = mid + 1 - start; i <= end; i++) { if (j > mid - start) { arr[i] = temp[k++]; } else if(k > end - start) { arr[i] = temp[j++]; } else if (temp[j] <= temp[k]) { arr[i] = temp[j++]; } else { arr[i] = temp[k++]; } } } //5.快速排序****************************************** template<typename T> vector<T> quickSort(vector<T> &arr) { _quickSort(arr, 0 ,arr.size() - 1); return arr; } template<typename T> void _quickSort(vector<T> &arr, int start, int end) { if (end - start < 1) return; int p = partion(arr, start, end); _quickSort(arr, start, p); _quickSort(arr, p + 1, end); } template<typename T> int partion(vector<T> &arr, int start, int end) { if (end - start < 1) return start; int temp = arr[start]; int j = start; for (int i = start +1; i <= end; i++) { if (arr[i] < temp) { j++; swap(arr[i], arr[j]); } } swap(arr[start], arr[j]); return j; } //列印 template<typename T> void PrintArr(vector<T> &arr) { int i = 0; while (i < arr.size()) { int j; for (j = i; j < 16 + i && j < arr.size(); j++) { cout << arr[j]<<' '; } cout << endl; i += 16; } } //生成隨機數 template<typename T> vector<T> Random(vector<T> &arr, T n, T L, T R) { srand((unsigned)time(NULL));//種子 for (int i = 0; i < n; i++) { arr.push_back(rand() % (R - L) + L); } return arr; } //計算時間 template<typename T> void testSort(const string &sortName, vector<T>(*sortname)(vector<T> &), vector<T> &arr) { clock_t startTime = clock(); sortname(arr); clock_t endTime = clock(); cout << sortName << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; return; } int main() { //隨機數測試 //1.氣泡排序 cout << "1.氣泡排序" << endl; vector<int> arr1; Random(arr1, 50, 100, 1000); bubbleSort(arr1); PrintArr(arr1); //2.插入排序 cout << "2.插入排序" << endl; vector<int> arr2; Random(arr2, 50, 100, 1000); insertSort(arr2); PrintArr(arr2); //3.選擇排序 cout << "3.選擇排序" << endl; vector<int> arr3; Random(arr3, 50, 100, 1000); selectionSort(arr3); PrintArr(arr3); //4.歸併排序 cout << "4.歸併排序" << endl; vector<int> arr4; Random(arr4, 50, 100, 1000); mergeSort(arr4); PrintArr(arr4); //5.快速排序 cout << "5.快速排序" << endl; vector<int> arr5; Random(arr5, 50, 100, 1000); quickSort(arr5); PrintArr(arr5); //測試消耗時間 //冒泡 vector<int> arrs1; Random(arrs1, 3000, 1, 100000); testSort("bubbleSort", bubbleSort, arrs1); //插入 vector<int> arrs2; Random(arrs2, 3000, 1, 100000); testSort("insertSort", insertSort, arrs2); //選擇 vector<int> arrs3; Random(arrs3, 3000, 1, 100000); testSort("selectionSort", selectionSort, arrs3); //歸併 vector<int> arrs4; Random(arrs4, 3000, 1, 100000); testSort("mergeSort", mergeSort, arrs4); //快速 vector<int> arrs5; Random(arrs5, 3000, 1, 100000); testSort("quickSort", quickSort, arrs5); getchar(); return 0; }
其中vector<T> Random(vector<T> &arr, T n, T L, T R)函式是隨機數生成,srand((unsigned)time(NULL));//種子可保證每次隨機數是同樣的。
clock_t startTime = clock();
sortname(arr);
clock_t endTime = clock();
演算法呼叫前後時間,再作差,統計排序同樣的隨機數所需時間。
當然特殊情況下結果可能有變,比如陣列本身就已經排好序了,呼叫以上的演算法所需時間可能發生變化,這個問題後面再討論。
以上知識來自於慕課。
相關推薦
新增、刪除、替換、插入到某個節點的方法(js、jq)
首先說下,具體用得到的方法: js: appendChild() //新增 removeChild() //刪除節點 insertBefore(插入節點,被插節點) //插入(前插後) replaceChild(新節點,舊節點) //替換(前替換後) jq: a
選擇排序法、氣泡排序法、插入排序法、系統提供的底層sort方法排序之毫秒級比較
我的程式碼: package PlaneGame;/** * 選擇排序法、氣泡排序法、插入排序法、系統提供的底層sort方法排序之毫秒級比較 * @author Administrator */import java.util.Arrays;public class Newtest { public sta
氣泡排序、選擇排序、二分查詢、插入排序
氣泡排序、選擇排序、二分查詢、插入排序 氣泡排序 氣泡排序的思想就是兩兩比較,按從小到大輸出的話,兩個值相比,較小的放前大的放後,那麼第一次兩兩比較結束後,最大值放在末尾,接下來再繼續兩兩比較,但是這一次不需要比較到最後,因為最後已經是最大值了,所以每次兩兩比較結束後,都會少比一次,
排序(上):氣泡排序、插入排序和選擇排序
如何分析一個排序演算法? 分析一個排序演算法的三要素:排序演算法的執行效率、排序演算法的記憶體消耗以及排序演算法的穩定性。 排序演算法的執行效率 對於排序演算法執行效率的分析,一般是從以下三個方面來衡量: 最好情況、最壞情況、平均情況時間複雜度 時間複雜度的係數、常數、低階 比較次數和交
java之氣泡排序、選擇排序、快速排序、插入排序、java8排序
package cn.com.javatest.sort; import org.apache.commons.lang3.StringUtils; /** * 常用排序方法 * * @author: Rodge * @time: 2018年10月4日 下午5:16:22 * @ve
排序演算法(直接插入、氣泡排序、選擇排序、快速排序、希爾排序、堆排序、歸併排序)
main函式 int main() { int data[] = {1,2,6,3,4,7,7,9,8,5}; //bubble_sort(data,10); //select_sort(data,10); Insert_Sort(data,10); fo
PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序
1、氣泡排序 原理:對一組資料,比較相鄰數的大小,將值大的放到後面。 <?php // 氣泡排序 function bubbleOrder($arr) { $count = count($arr); $temp = 0; // 外層控制排序次數 for ($
排序演算法上——氣泡排序、插入排序和選擇排序
1. 排序演算法? 排序演算法應該算是我們最熟悉的演算法了,我們學的第一個演算法,可能就是排序演算法,而在實際應用中,排序演算法也經常會被用到,其重要作用不言而喻。 經典的排序演算法有:氣泡排序、插入排序、選擇排序、歸併排序、快速排序、計數排序、基數排序、桶排序。按
氣泡排序、選擇排序、插入排序、快速排序演算法耗時測試
import java.util.*; public class Test1 { public static void main(String[] args) throws Exception{ int[] arr1=new int[20000]; for(int i=0;i&l
幾種排序方法詳解(選擇排序、氣泡排序、插入排序、快速排序)
由於本帖只是闡述幾種排序方法的原理、如何區分以及編寫幾種排序的簡單程式碼,所以直接給定陣列是 a[ ]={6,2,8,5,1},需要把以上5個數字按升序排列 1. 選擇排序法 (如果不想看解釋分析,直接往後拉看程式碼) 實質: 第一輪:通過對比陣列中前一個元素和後一個元素
資料結構--氣泡排序、歸併排序、快速排序、選擇排序、插入排序(Java版)
一、氣泡排序 1、思路 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 針對所有的元素重複以上的步驟,直到沒有任何一對元素需要比較。 2、實現 /** * 排序演算法的介面 * @author hoaven */ pu
《C語言》氣泡排序、快速排序、選擇排序、堆排序、桶排序、插入排序。
氣泡排序、快速排序、選擇排序、堆排序、桶排序、插入排序。 Main.c MySort.h MySort.c Main.c #include <time.h> #include "MySort.h" #define N 10
選擇、插入、氣泡排序
說明 選擇排序( Selectionsort)、插入排序( Insertionsort) 與氣泡排序( Bubblesort) 這三個排序方式是初學排序所必須知道的三個基本排序方式,
三個簡單、基本的排序演算法---氣泡排序 、選擇排序、插入排序
1.氣泡排序 public class BubbleSort { public static void sort(long[] arr){ long temp; for(int i=0;i<arr.length-1;i++){ for(int j=ar
用python實現選擇排序法、氣泡排序法、插入排序法
氣泡排序法 l = [10, 1, 18, 30, 23, 12, 7, 5, 18, 17] for n in range(len(l)-1): for i in range(len(l)-n-1): if l[i] > l[i+1]:
3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序、快速排序,請選擇任意2種用java實現 [分值:20] 您的回答:(空) (簡答題需要人工評分)
3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序、快速排序,請選擇任意2種用java實現 [分值:20] 您的回答:(空) (簡答題需要人工評分) package com.interview; /** * 各種排序演算法 */
Java常用的八種排序演算法與程式碼實現(一):氣泡排序法、插入排序法、選擇排序法
這三種排序演算法適合小規模資料排序 --- 共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法) 不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是 --- 穩定排序演算法:可以保持數值相等的兩個物件,在排序之
C語言中常用排序演算法(氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序)實現比較
以下程式在win10 X64位作業系統,使用VS2017執行驗證可行 排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。 例項1 冒泡法排序 1.前言: 陣列中有N個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法
筆記二:計數排序、選擇排序、氣泡排序、插入排序
計數排序 1、 名次 :所謂名次,通俗理解即為該元素在序列中排行老幾的意思。 2.、如何求名次:依次對每一個元素進行比較,若排在自己(該元素)前面的元素比自己大,則前面的元素在排行計數上加1,反之則自己加1。 3、利用附加陣列的計數排序:根據自身名次重新
氣泡排序法、選擇排序法、插入排序法
一貫作風,不說廢話,程式碼走起 先是測試程式碼: @Test public void test1() { //隨機生成length為10 的陣列 int[] arr=new int[10]; for (int i=0;i<arr.length;i++) {