zoukankan      html  css  js  c++  java
  • 原地堆排序

     

    原地堆排序算法:

    template<typename T>
    void heapSort(T arr[], int n){
    
        for( int i = (n-1)/2 ; i >= 0 ; i -- )
            __shiftDown2(arr, n, i);
    
        for( int i = n-1; i > 0 ; i-- ){
            swap( arr[0] , arr[i] );
            __shiftDown2(arr, i, 0);
        }
    }

     

    template<typename T>
    void __shiftDown(T arr[], int n, int k){
    
        while( 2*k+1 < n ){
            int j = 2*k+1;
            if( j+1 < n && arr[j+1] > arr[j] )
                j += 1;
    
            if( arr[k] >= arr[j] )break;
    
            swap( arr[k] , arr[j] );
            k = j;
        }
    }

    测试代码:

    int main() {
    
        int n = 1000000;
    
        // 测试1 一般性测试
        cout<<"Test for Random Array, size = "<<n<<", random range [0, "<<n<<"]"<<endl;
        int* arr1 = SortTestHelper::generateRandomArray(n,0,n);
        int* arr2 = SortTestHelper::copyIntArray(arr1, n);
        int* arr3 = SortTestHelper::copyIntArray(arr1, n);
        int* arr4 = SortTestHelper::copyIntArray(arr1, n);
        int* arr5 = SortTestHelper::copyIntArray(arr1, n);
        int* arr6 = SortTestHelper::copyIntArray(arr1, n);
    
        SortTestHelper::testSort("Merge Sort", mergeSort, arr1, n);
        SortTestHelper::testSort("Quick Sort", quickSort, arr2, n);
        SortTestHelper::testSort("Quick Sort 3 Ways", quickSort3Ways, arr3, n);
        SortTestHelper::testSort("Heap Sort 1", heapSort1, arr4, n);
        SortTestHelper::testSort("Heap Sort 2", heapSort2, arr5, n);
        SortTestHelper::testSort("Heap Sort 3", heapSort, arr6, n);
    
        delete[] arr1;
        delete[] arr2;
        delete[] arr3;
        delete[] arr4;
        delete[] arr5;
        delete[] arr6;
    
        cout<<endl;
    
    
        // 测试2 测试近乎有序的数组
        int swapTimes = 100;
        cout<<"Test for Random Nearly Ordered Array, size = "<<n<<", swap time = "<<swapTimes<<endl;
        arr1 = SortTestHelper::generateNearlyOrderedArray(n,swapTimes);
        arr2 = SortTestHelper::copyIntArray(arr1, n);
        arr3 = SortTestHelper::copyIntArray(arr1, n);
        arr4 = SortTestHelper::copyIntArray(arr1, n);
        arr5 = SortTestHelper::copyIntArray(arr1, n);
        arr6 = SortTestHelper::copyIntArray(arr1, n);
    
        SortTestHelper::testSort("Merge Sort", mergeSort, arr1, n);
        SortTestHelper::testSort("Quick Sort", quickSort, arr2, n);
        SortTestHelper::testSort("Quick Sort 3 Ways", quickSort3Ways, arr3, n);
        SortTestHelper::testSort("Heap Sort 1", heapSort1, arr4, n);
        SortTestHelper::testSort("Heap Sort 2", heapSort2, arr5, n);
        SortTestHelper::testSort("Heap Sort 3", heapSort, arr6, n);
    
        delete[] arr1;
        delete[] arr2;
        delete[] arr3;
        delete[] arr4;
        delete[] arr5;
        delete[] arr6;
    
        cout<<endl;
    
    
        // 测试3 测试存在包含大量相同元素的数组
        cout<<"Test for Random Array, size = "<<n<<", random range [0,10]"<<endl;
        arr1 = SortTestHelper::generateRandomArray(n,0,10);
        arr2 = SortTestHelper::copyIntArray(arr1, n);
        arr3 = SortTestHelper::copyIntArray(arr1, n);
        arr4 = SortTestHelper::copyIntArray(arr1, n);
        arr5 = SortTestHelper::copyIntArray(arr1, n);
        arr6 = SortTestHelper::copyIntArray(arr1, n);
    
        SortTestHelper::testSort("Merge Sort", mergeSort, arr1, n);
        SortTestHelper::testSort("Quick Sort", quickSort, arr2, n);
        SortTestHelper::testSort("Quick Sort 3 Ways", quickSort3Ways, arr3, n);
        SortTestHelper::testSort("Heap Sort 1", heapSort1, arr4, n);
        SortTestHelper::testSort("Heap Sort 2", heapSort2, arr5, n);
        SortTestHelper::testSort("Heap Sort 3", heapSort, arr6, n);
    
        delete[] arr1;
        delete[] arr2;
        delete[] arr3;
        delete[] arr4;
        delete[] arr5;
        delete[] arr6;
    
    
        return 0;
    }

     

  • 相关阅读:
    梳理一下自己的技术关注面[转]
    在SharePoint 2010系统中安装RBS FILESTREAM Provider
    53套SharePoint 2010站点模版在线演示及下载
    sharepoint form认证下的当前在线用户统计和当日浏览量的统计
    MOSS部署常用的stsadm命令行
    asp.net实现伪静态的几种常用的方法
    新闻滚动效果JQuery实现
    百度编辑器Ueditor的使用
    新闻滚动JS
    SQL分页笔记
  • 原文地址:https://www.cnblogs.com/lzb0803/p/9192145.html
Copyright © 2011-2022 走看看