swap函数对性能的影响

来源:2-6 插入排序法的改进

Sunny_Winter

2019-10-09

使用swap函数

template<typename T>
void bubbleSort2(T arr[], int n){
    int newn; //使用newn进行优化
    
    do{
        newn = 0;
        for(int i = 1; i < n; i ++){
            if(arr[i-1] > arr[i]){
                swap(arr[i-1], arr[i]);
                // 记录最后一次的交换位置,在此之后的元素在下一轮扫描中均不考虑
                newn = i;            
            }        
        }
        n = newn;
    }while(newn > 0);
}

使用基本交换

template<typename T>
void bubbleSort4(T arr[], int n){
    int newn; //使用newn进行优化
    int i,j;
    T temp;
    do{
        newn = 0;
        for(i = 1; i < n; i ++){
            if(arr[i-1] > arr[i]){
                temp = arr[i-1];
                arr[i-1] = arr[i];
                arr[i] = temp;
                // 记录最后一次的交换位置,在此之后的元素在下一轮扫描中均不考虑
                newn = i;            
            }        
        }
        n = newn;
    }while(newn > 0);
}

测试代码

#include "SortTestHelper.h"
#include "SelectionSort.h"
#include "InsertionSort.h"
#include "BubbleSort.h"
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);
    int *arr5 = SortTestHelper::copyIntArray(arr, n);
    int *arr6 = SortTestHelper::copyIntArray(arr, n);
    //SortTestHelper::testSort("Selection Sort",selectionSort,arr,n);
    //SortTestHelper::testSort("Insertion Sort",insertionSort,arr2,n);
    //SortTestHelper::testSort("Bubble Sort",bubbleSort,arr3,n);
    SortTestHelper::testSort("Bubble Sort 2",bubbleSort2,arr4,n);
    //SortTestHelper::testSort("Bubble Sort 3",bubbleSort3,arr5,n);
    SortTestHelper::testSort("Bubble Sort 4",bubbleSort4,arr6,n);
    return 0;
}

当n=10000时,

http://img.mukewang.com/szimg/5d9d4e8f0945c74607450094.jpg

当n=100000时,

http://img1.sycdn.imooc.com/szimg/5d9d4f110990de6707520097.jpg

不使用swap函数时,性能提升了近一倍。

写回答

1回答

liuyubobobo

2019-10-09

是的哦。因为标准库中的 swap 使用了泛型,所以要做类型推断:)


继续加油!:)

2
0

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程