自动生成数组:
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() % (rangeR - rangeL + 1) + rangeL;
return arr;
}
测试时间:
void testSort(const string sortName, void (*sort)(T[], int), T arr[], int n) {
clock_t startTime = clock();
sort(arr, n);
clock_t endTime = clock();
cout << sortName << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " s" << endl;
return;
}
选择排序:
template<typename T>
void selectionSort(T arr[], int n){
for(int i = 0 ; i < n ; i ++){
// 寻找[i, n)区间里的最小值
int minIndex = i;
for( int j = i + 1 ; j < n ; j ++ )
if( arr[j] < arr[minIndex] )
minIndex = j;
swap( arr[i] , arr[minIndex] );
}
}
插入排序:对近乎有序的数组排序效率最高。
//一种写法,每比较一次交换一次,时间上比选择排序更长
void insertionSort(T arr[], int n){
for( int i = 1 ; i < n ; i ++ ) {
// 每次起一张牌,
for( int j = i ; j > 0 ; j-- )
if( arr[j] < arr[j-1] )
swap( arr[j] , arr[j-1] );
}
return;
}
//另一种写法,往后赋值,效率更高。
void insertionSort(T arr[], int n){
for( int i = 1 ; i < n ; i ++ ) {
T e = arr[i];
int j; // j保存元素e应该插入的位置
for (j = i; j > 0 && arr[j-1] > e; j--)
arr[j] = arr[j-1];
arr[j] = e;
}
return;
}
冒泡排序也是常见方法,奥巴马也会的。
希尔排序是插入排序的一种改进,加入了步长的概念。
可以参见干货菌其他文章:https://www.toutiao.com/i6600553503154766339/
