zoukankan      html  css  js  c++  java
  • 各种排序算法的比较

    1.main.cpp 主函数

    #include <iostream>
    #include<algorithm>
    #include <string>
    #include "SortTestHelper.h"
    #include "SelectionSort.h"
    #include "BubbleSort.h"
    using namespace std;
    //插入排序
    template<typename T>
    void insertSort(T arr[], int n){
        for (int i = 1; i < n; i++){    
            
            for (int j = i; j >= 1; j--){            
                if (arr[j] < arr[j-1])
                    swap(arr[j-1], arr[j]);
                else
                    break;   //提前终止循环,减少不必要的运算。当执行到此步骤时,说明前者小于后者,而前面也已经排好序。
                
            }        
        }
    }
    //理论上插入排序要比选择排序快,因为中间就break,但实际上耗时更长。因为频繁的swap()操作更耗时。
    //改进后
    template<typename T>
    void insertSortImprove(T arr[], int n){
        for (int i = 1; i < n; i++){
            T tempValue = arr[i];
            int j;  //保存要存放的位置
            for (j = i; j >0 && arr[j - 1] > tempValue; j--){            
                arr[j] = arr[j - 1];            
            }
            arr[j] = tempValue;
        }
    }
    
    
    int main(){
    
        int n = 10000;
        int *arr = SortTestHelper::generateRandomArray(n, 0, n);    
        int *arr2 = SortTestHelper::copyIntArray(arr,n);
        int *arr3 = SortTestHelper::copyIntArray(arr, n);
        int *arr4 = SortTestHelper::copyIntArray(arr, n);
        SortTestHelper::testSort("Selection Sort", selectionSort, arr, n);
        SortTestHelper::testSort("Insert Sort", insertSort, arr2, n);
        SortTestHelper::testSort("Insert Sort Improve", insertSortImprove, arr3, n);
        SortTestHelper::testSort("Bubble Sort", bubbleSort, arr4, n);
        //四种算法耗时长短比较  优化的插入排序<选择排序<冒泡排序<插入排序 
        //这四种算法都是O(n2)级别的运算量
        delete[] arr;
        delete[] arr2;
        delete[] arr3;
        delete[] arr4;
        system("pause");
        return 0;
    }

    2.SortTestHelper.h 

    #ifndef SELECTIONSORT_SORTTESTHELPER_H
    #define SELECTIONSORT_SORTTESTHELPER_H
    
    #include <iostream>
    #include <ctime>
    #include <cassert>
    
    using namespace std;
    
    namespace SortTestHelper{
    	//generateRandomArray 产生n个范围[rangeL,rangeR]的随机数
    	int* generateRandomArray(int n, int rangeL, int rangeR){
    		assert(rangeL <= rangeR);
    		int *arr = new int[n];
    		srand(time(NULL));
    		for (int i = 0; i < n; i++){
    			arr[i] = rand() % (rangeL - rangeR + 1) + rangeL;
    		}
    		return arr;
    	}
    	template<typename T>
    	void printArray(T arr[], int n){
    		for (int i = 0; i < n; i++)
    			cout << arr[i] << " ";
    		cout << endl;
    
    		return;
    	}
    
    	//isSorted 判断是否排序成功
    	template<typename T>	
    	bool isSorted(T arr[], int n){
    		for (int i = 0; i < n - 1; i++){
    			if (arr[i]>arr[i + 1])
    				return false;
    			}
    		return true;		
    	}
    
    	//testSort 测试排序时间
    	template<typename T>
    	void testSort(string sortName, void(*sort)(T[], int), T arr[], int n){
    		clock_t startTime = clock();
    		sort(arr, n);
    		clock_t endTime = clock();
    		assert(isSorted(arr, n));
    		cout << sortName << ":" << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
    		return;
    	}
    
    	//copyIntArray 拷贝数组
    	int* copyIntArray(int a[], int n){
    		int* copyA = new int[n];
    		copy(a, a + n, copyA);
    		return copyA;
    	}
    }
    
    #endif
    

    3.SelectionSort.h 选择排序

    template<typename T>
    void selectionSort(T arr[], int n){
    
        for (int i = 0; i < n; i++){
            int minIndex = i;
            for (int j = i + 1; j < n; j++){
                if (arr[j] < arr[minIndex]){
                    minIndex = j;
                }
    
            }
            swap(arr[i], arr[minIndex]);
        }
    }

    4.BubbleSort.h 冒泡排序

    template<typename T>
    void bubbleSort(T arr[], int n){
        for (int i = 0; i < n - 1; i++){
            for (int j = i + 1; j < n; j++){
                if (arr[i]>arr[j]){
                    swap(arr[i], arr[j]);
                }
            }
        }
    }
  • 相关阅读:
    序列JSON数据和四种AJAX操作方式
    jquery.validate和jquery.form.js实现表单提交
    JQuery Validate使用总结1:
    HOWTO: Include Base64 Encoded Binary Image Data (data URI scheme) in Inline Cascading Style Sheets (CSS)(转)
    SharePoint 2007 使用4.0 .Net
    动态IP解决方案
    取MS CRM表单的URL
    从Iframe或新开的窗口访问MS CRM 2011(转)
    Toggle or Hidden MS CRM Tab
    Windows 2008下修改域用户密码
  • 原文地址:https://www.cnblogs.com/morongwendao/p/6869194.html
Copyright © 2011-2022 走看看