#include <iostream>
#include <ctime>
#include <cstdlib>
#include <windows.h>
using namespace std;
void sort1(int *a,int n);//我自己常写的排序
void sort2(int *a,int n);//冒泡排序
void sort3(int *a,int n);//选择排序
void sort4(int *a,int n);//插入排序
void sort5(int *a,int n);//快速排序
void show(int *a,int n)
{
for (int j=0;j<n;j++)
{
cout << a[j] << " ";
}
}
void Set(int *a,int n)
{
for (int j=0;j<n;j++)
{
a[j] = n - j;
}
}
//
void sort1(int *a,int n)
{
for (int i=0;i<n;i++)
{
for (int j=i+1;j<n;j++)
{
if (a[i]>a[j])
{
swap(a[i],a[j]);
}
}
}
} //如果第一个数大于后面的数,交换。找出最小的放在前面!
/// 冒泡
void sort2(int *a,int n)
{
bool bswapped ;
do
{
bswapped = false;
for (int i=0;i<n-1;i++)
{
if (a[i]>a[i+1])
{
swap(a[i],a[i+1]);
bswapped =true;
}
}
} while (bswapped);
} //每一轮都要比较相邻的数据,直到没有交换为止! 效率最低
/// 选择
void sort3(int *a,int n)
{
for (int i=0;i<n-1;i++)
{
int pos = i; //记下下标
int min = a[pos] ; //记下最小值
for (int j=i+1;j<n;j++)
{
if (a[j]<min) //如果后面还有比min小的值
{
pos = j; //记下下标
min = a[pos]; //设整个数组的最小值
}
}
if (pos != i) //如果最小值的下标变了
{
a[pos] = a[i];
a[i] = min; //交换2个数的值
}
}
}
//先假定第一个数是最小的,然后找出后面比他小的数记下下标
/// 插入
void sort4(int *a,int n)
{
for ( int i=1;i<n;i++) //从第二个元素开始 第一个已经排好!
{
int cur = a[i];
for (int j=i;j>0 && a[j-1] >cur ;j--) //从已经排好的数列中的最后一个位置向前//直到确定正确的位置
{
a[j] = a[j-1]; //腾出空间 向后挪一个位置
if (j!=i)
{
a[j] =cur; //把待插入的数据放在正确的位置
}
}
}
}
快速
void Swap(int *a,int *b)
{
int c =*a;
*a = *b;
*b = c;
}
void sort5(int *a,int n)
{
if (n<=1)
{
return;
}
Swap(a,a+(n/2)); //把中间的数放到第一个去了
int num = *a;
int *L = a + 1; //从第二个数开始
int *R = a + n -1; // 从最后一个数开始
while (L<R)
{
while (L<R&& *L < num) L++; //左边比num小 跳过
while (R>=L && *R >= num ) R--; //右边比num大 跳过
if (L<R)
{
Swap(L,R); //交换数据 使得比num小的在左边
}
}
if (*R < num)
{
Swap(a,R); //把分界值换回来
}
sort5(a,R-a);
sort5(R+1,n-(R-a)-1);
}
// 把一个数组分成2部分,把大于分界值的数据集中到一边,不小于的集中到一边,然后递归!
//
int main()
{
const int max = 10000;
int a[max];
Set(a,max);
DWORD p = GetTickCount();
sort5(a,max);
DWORD q = GetTickCount() -p;
cout << q << endl;
// show(a,max);
return 0;
}