#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include <memory.h>
inline __int64 GetCpuCounter(){
__asm _emit 0x0F
__asm _emit 0x31
}
template <class Elem>
void swap(Elem &e1,Elem &e2){
Elem temp = e2;
e2 = e1;
e1 = temp;
}
template <class Elem>
void bubSort(Elem A[], int n){
for(int i =0; i <n-1; i++)
for(int j = n-1; j > i; j--) //bubble up i'th element
if(A[j] < A[j-1])
swap<Elem>(A[j],A[j-1]);
}
template<class Elem>
int partition(Elem A[],int left, int right) //right一定大于left
{
Elem temp = A[left];
do{
// 循环找出右边起第一个比temp小的数
while((right > left)&&(A[--right] > temp));
if(left < right)
swap<Elem>(A[right], A[left]); // 将此数和A[left]交换
// 循环找出左边起第一个比temp大的数
while((left < right)&&(A[++left] < temp));
if(left < right)
swap<Elem>(A[right], A[left]);
}
while(left < right);
return left;
}
template<class Elem, int THRESHOLD>
void qSort(Elem A[],int left,int right){
if(left >= right)
return;
int size = right - left + 1;
if(size <= THRESHOLD){
bubSort<Elem>(&A[left], size);
return;
}
if(A[left] > A[right]) //让A[left]和A[right-1]以前的元素比较
swap<Elem>(A[right], A[left]);
int k = partition<Elem>(A,left,right);
qSort<Elem, THRESHOLD>(A,left,k-1);
qSort<Elem, THRESHOLD>(A,k+1,right);
}
#define TestThreshold(a, size, startThreshold, conter1, counter2, passed) \
conter1 = GetCpuCounter(); \
qSort<int, startThreshold>(a, 0, size - 1); \
counter2 = GetCpuCounter(); \
passed = counter2 - conter1; \
printf("Threshold:%2d cpu Counter: %ld\n", startThreshold, passed);
int main(){
const int arraySize = 100000;
int origin[arraySize];
srand(time(0));
for(int n = 0; n < arraySize; n++){
origin[n] = rand() % 10000000;
}
int a[arraySize];
//
__int64 counter1;
__int64 counter2;
__int64 passed;
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold4 = 4;
TestThreshold(a, arraySize, threshold4, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold5 = 5;
TestThreshold(a, arraySize, threshold5, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold6 = 6;
TestThreshold(a, arraySize, threshold6, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold7 = 7;
TestThreshold(a, arraySize, threshold7, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold8 =8;
TestThreshold(a, arraySize, threshold8, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold9 = 9;
TestThreshold(a, arraySize, threshold9, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold10 = 10;
TestThreshold(a, arraySize, threshold10, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold11 = 11;
TestThreshold(a, arraySize, threshold11, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold12 = 12;
TestThreshold(a, arraySize, threshold12, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold13 = 13;
TestThreshold(a, arraySize, threshold13, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold14 = 14;
TestThreshold(a, arraySize, threshold14, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold15 = 15;
TestThreshold(a, arraySize, threshold15, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold16 = 16;
TestThreshold(a, arraySize, threshold16, counter1, counter2, passed);
memcpy(a, origin, sizeof(int) * arraySize);
const int threshold17 = 17;
TestThreshold(a, arraySize, threshold17, counter1, counter2, passed);
getchar();
return 0;
}