概要:
对比方法:
我们通过选择排序和插入排序去进行100000数据量的排序所用时间来对比;
(1);写一个帮助类;SortHelper;类中有三个函数:generateRandromArray:用于生产随机数组;testSort:测试调用某个函数所花费的时间;copyArray:数组复制。
//生成n个的随机数组,,每个元素的范围{RangeL,RangeR}
int * generateRandromArray(int n, int rangel, int rangeR) {
int *arr = new int[n];
srand(time(0));
for (int i = 0; i < n; i++) {
arr[i] = rand() % (rangeR - rangel + 1) + rangel+1;
}
return arr;
}
//测试调用某个函数所花费的时间;
void testSort(string sortName, void(*sort)(T[], int n),int arr[],int n) {
clock_t startTime = clock();
sort(arr, n);
clock_t endTime = clock();
if(isSort(arr, n))
cout << sortName << ":" << double(endTime - startTime)/CLOCKS_PER_SEC << endl;
return;
}
//数组复制
int * copyArray(int arr[], int n) {
int * temp=new int[n];
for (int i = 0; i < n; i++)
temp[i] = arr[i];
return temp;
}
(2)
写一个Sort类:里面有:selectSort:选择排序,insertSort:插入排序
//选择排序
void selectSort(int *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]);
}
}
//插入排序
void insertSort(int arr[], int n) {
int j;
for (int i = 1; i < n; i++) {
int e = arr[i];
for ( j = i; j >= 1 && e<arr[j - 1]; j--)
arr[j] = arr[j - 1];
arr[j] = e;
}
}
(3)main函数;
#include<iostream>
#include<cmath>
#include<algorithm>
#include"SortHelper.h"
#include"Sort.h"
using namespace std;
int main() {
int n = 100000;
int *arr = SortTestHelper::generateRandromArray(n, 0, n);
int *arr1;
arr1 = SortTestHelper::copyArray(arr, n);
arr2 = SortTestHelper::copyArray(arr, n);
SortHelper::testSort("选择排序",Sort::selectSort,arr,n);
SortHelper::testSort("插入排序", Sort::insertSort, arr1, n);
delete[]arr;
delete[]arr1;
return 0;
}
(3)结果:
通过结果我们可以看出插入排序比选择排序要快一赔;
(4)更深层的体现:如果对于一组近乎有序的数组来说;又会有怎样的差异;为了更好的展现,我们在main函数中先用选择排序将一个数组排好序,然后在分别用选择排序和插入排序进行排序;结果如下:
看到没有,区别大不大,这得多少赔啊,所以说对于近乎有序的数据,采用插入排序是再好不过了。
(5)原因:
我简单说一下:对于一个完全有序的数组:用选择排序,还是得一个个去比较,比如1,2,3,4;1要分别与2,3,4,比较,排序完需要进行4*4-4=12次,对于数组有n个元素来说既是要比较:n*(n-1)次;但是对于插入排序,从2开始,2只要跟1比较一次,3只要跟2比较一次,4只要跟3比较一次,这样下来,对于n个元素:只需要(n-1)次比较;
总结
认真领会,理解。