1. 程式人生 > >氣泡排序、插入排序、選擇排序、歸併排序、快速排序

氣泡排序、插入排序、選擇排序、歸併排序、快速排序

下面提供原始碼檔案,執行環境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();

演算法呼叫前後時間,再作差,統計排序同樣的隨機數所需時間。

當然特殊情況下結果可能有變,比如陣列本身就已經排好序了,呼叫以上的演算法所需時間可能發生變化,這個問題後面再討論。

以上知識來自於慕課。

相關推薦

新增刪除替換插入到某個節點的方法(jsjq)

首先說下,具體用得到的方法: 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++) {