#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <time.h>
#define N 1000000
using namespace std;
inline void swap(int *a, int *b)
{
if (a != b)
{
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}
}
void isOrder(int a[], int n)
{
int i = 1;
for (; i < n; ++i)
{
if (a[i - 1]>a[i])
{
printf("错误\n");
return;
}
}
printf("升序\n");
}
//冒泡排序
void buble(int a[],int n)
{
int k,flag = n;
while (flag)
{
k = flag;
flag = 0;
for (int i = 1; i < k; ++i)
{
if (a[i - 1]>a[i])
{
swap(a + i - 1, a + i);
flag = i;
}
}
}
}
//插入排序
void insert(int a[], int n)
{
int temp, j;
for (int i = 1; i < n; ++i)
{
temp = a[i];
j = i - 1;
while (j >= 0 && a[j] > temp)
{
a[j + 1] = a[j];
--j;
}
a[j + 1] = temp;
}
}
//希尔排序
void shell(int a[], int n)
{
int temp, k,i;
for (int gap = n / 2; gap > 0; gap /= 2)
{
for (i = gap; i<n; ++i)
{
if (a[i]<a[i - gap])
{
temp = a[i];
k = i - gap;
while (k >= 0 && a[k]>temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}
}
}
//归并排序
void mergyArray(int a[], int first, int mid, int last, int temp[])
{
int i = first;
int j = mid+1;
int k = 0;
while (i <= mid && j <= last)
{
if (a[i] > a[j])
temp[k++] = a[j++];
else
temp[k++] = a[i++];
}
while (i <= mid)
temp[k++] = a[i++];
while (i <= mid)
temp[k++] = a[i++];
for (i = 0; i<k; ++i)
a[first + i] = temp[i];
}
void mergeSort(int a[], int first, int last, int temp[])
{
if (first<last)
{
int mid = (first + last) / 2;
mergeSort(a, first, mid, temp);
mergeSort(a, mid+1, last, temp);
mergyArray(a, first, mid, last, temp);
}
}
void merge(int a[],int n)
{
int *p = new int[n];
mergeSort(a, 0, n - 1, p);
delete[] p;
}
//快速排序
void quickSort(int a[], int n)
{
if (n>1)
{
int *first = a;
int *last = a + n - 1;
int x = a[0];
while (first<last)
{
while (first < last && *last >= x)
--last;
if (first < last)
*first++ = *last;
while (first < last && *first <= x)
++first;
if (first < last)
*last-- = *first;
}
*first = x;
quickSort(a, first - a);
quickSort(first + 1, n + a - first - 1);
}
}
void show(int a[], int n)
{
n = n > 1000 ? 1000 : n;
for (int i = 0; i < n; ++i)
printf("%d ", a[i]);
printf("\n");
}
//堆排序
//堆向上调整
void minHeapFixUp(int a[], int i)
{
int fa = (i - 1) / 2;
int temp = a[i];
while (fa >= 0 && i!=0)
{
if (a[fa] <= temp)
break;
a[fa] = a[i];
i = fa;
fa = (i - 1) / 2;
}
a[i] = temp;
}
//堆向下调整
void minHeapFixDown(int a[], int n, int i)
{
int zi = i * 2 + 1;
int temp = a[i];
while (zi < n)
{
if (zi + 1 < n && a[zi + 1] < a[zi])
++zi;
if (a[zi]>temp)
break;
a[i] = a[zi];
i = zi;
zi = i * 2 + 1;
}
a[i] = temp;
}
//建立最小堆
void MakeMinHeap(int a[], int n)
{
for (int i = n / 2 - 1; i >= 0; --i)
minHeapFixDown(a, n, i);
}
//堆排序
void minHeapSort(int a[], int n)
{
MakeMinHeap(a, n);
for (int i = n - 1; i >= 1; --i)
{
swap(a, a + i);
minHeapFixDown(a, i, 0);
}
int i = 0, j = n - 1;
while (i < j)
swap(a[i++], a[j--]);
}
void run_time(void(*p)(int[], int), int a[], int b[],int n)
{
for (int i = 0; i < N; ++i)
a[i] = b[i];
long start = clock();
p(a, n);
long val = clock() - start;
isOrder(a, N);
cout << "运行时间:" << val << endl << endl;
}
void comp()
{
int n = N;
int *a = (int *)malloc(sizeof(int)*N);
int *b = (int *)malloc(sizeof(int)*N);
for (int i = 0; i < N; ++i)
b[i] = rand() % (N * 2);
cout << "冒泡排序:";
//run_time(buble, a,b, n);
cout << "插入排序:";
//run_time(insert, a,b, n);
cout << "希尔排序:";
run_time(shell, a, b, n);
cout << "归并排序:";
run_time(merge, a, b, n);
cout << "快速排序:";
run_time(quickSort, a, b, n);
cout << "堆排序:";
run_time(minHeapSort, a, b, n);
}
void main()
{
srand(time(NULL));
comp();
system("pause");
}
各种排序
最新推荐文章于 2024-05-14 02:41:33 发布