#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int k[2000] = { 0 };
//直接插入排序
void Sort1(int length)
{
int a[2000] = {0};
for (int t = 0; t < length+1; t++)
{
a[t] = k[t];
}
int i, j;
int b=0, m=0;
for (i = 2; i < length+1; i++)
{
a[0] = a[i];
for (j = i-1;a[0]<a[j];j--)
{
a[j + 1] = a[j];
m++;
b++;
}
b++;
a[j + 1] = a[0];
}
printf("直接插入排序\n");
printf("比较次数:%d 移动次数:%d", b, m);
}
//折半插入排序
void Sort2(int length)
{
int a[2000] = { 0 };
for (int t = 0; t < length + 1; t++)
{
a[t] = k[t];
}
int m=0, b=0;
int i, j;
for (i = 2; i < length+1; i++)
{
a[0] = a[i];
int low = 1, high = i - 1;
int mid;
while (low<=high)
{
mid = (low + high) / 2;
if (a[0]<a[mid])
{
high = mid - 1;
b++;
}
else
{
low = mid + 1;
}
b++;
}
for (j = i-1;j>=high+1;j--)
{
a[j + 1] = a[j];
m++;
}
a[high+1] = a[0];
}
printf("折半插入排序\n");
printf("比较次数:%d 移动次数:%d", b, m);
}
//希尔排序
void Sort3(int length)
{
int a[2000] = { 0 };
for (int t = 0; t < length + 1; t++)
{
a[t] = k[t];
}
int m=0, b=0;
int i, j;
for (int dk = length/2; dk>=1; dk=dk/2)
{
for (i = dk+1; i <= length; i++)
{
if (a[i]<a[i-dk])
{
b++;
a[0] = a[i];
for (j =i-dk ;j>0&&a[0]<a[j]; j-=dk)
{
a[j + dk] = a[j];
m++;
}
a[j + dk] = a[0];
}
b++;
}
}
printf("希尔排序\n");
printf("比较次数:%d 移动次数:%d", b, m);
}
//冒泡排序
void Sort4(int length)
{
int a[2000] = { 0 };
for (int t = 0; t < length + 1; t++)
{
a[t] = k[t];
}
int m = 0, b = 0;
int i, j;
for (i = 1; i < length; i++)
{
bool flag = false;
for (j = length-1; j>i; j--)
{
if (a[j - 1] > a[j])
{
int t;
t = a[j - 1];
a[j - 1] = a[j];
a[j] = t;
flag = true;
m++;
b++;
}
b++;
}
if (flag == false)
{
printf("冒泡排序\n");
printf("比较次数:%d 移动次数:%d", b, m);
return;
}
}
}
//快速排序
int b5 = 0, m5 = 0;
int a5[2000] = { 0 };
int partition(int low,int high)
{
int pivot = a5[low];
while (low<high)
{
while (low<high&&a5[high]>=pivot)
{
high--;
b5++;
}
b5++;
a5[low] = a5[high];
m5++;
while (low<high&&a5[low]<=pivot)
{
low++;
b5++;
}
b5++;
a5[high] = a5[low];
m5++;
}
a5[low] = pivot;
return low;
}
void Sort5(int low,int high)
{
if (low<high)
{
int pivot = partition(low, high);
Sort5(low, pivot - 1);
Sort5(pivot + 1, high);
}
return;
}
//简单选择排序
void Sort6(int length)
{
int a[2000] = { 0 };
for (int t = 0; t < length + 1; t++)
{
a[t] = k[t];
}
int m = 0, b = 0;
for (int i = 1; i < length; i++)
{
int min=i;
for (int j = i+1; j <= length; j++)
{
if (a[j] < a[min])
{
b++;
min = j;
}
b++;
}
if (min!=i)
{
int t;
t = a[min];
a[min] = a[i];
a[i] = t;
m++;
}
}
printf("简单选择排序\n");
printf("比较次数:%d 移动次数:%d", b, m);
return;
}
//堆排序
int b7 = 0, m7 = 0;
void adjustDown(int a[],int k,int length)
{
a[0] = a[k];
for (int i = 2*k; i <= length; i=i*2)
{
if (i < length && a[i] < a[i + 1])
{
i++;
b7++;
}
b7++;
if (a[0] > a[i])
{
b7++;
break;
}
else
{
a[k] = a[i];
k = i;
m7++;
}
b7++;
}
a[k] = a[0];
}
void Sort7(int length)
{
int a[2000] = { 0 };
for (int t = 0; t < length + 1; t++)
{
a[t] = k[t];
}
for (int i = length / 2; i > 0; i--)
{
adjustDown(a,i,length);
}
for (int i = length; i > 1; i--)
{
int t;
t = a[i];
a[i] = a[1];
a[1] = t;
m7++;
adjustDown(a, 1, i - 1);
}
printf("堆排序\n");
printf("比较次数:%d 移动次数:%d", b7, m7);
return;
}
//归并排序
int b8 = 0, m8 = 0;
int a8[2000] = { 0 };
int b[2000] = { 0 };
void merge(int low,int mid,int high)
{
int k, i, j;
for (int q = low; q <= high; q++)
{
b[q] = a8[q];
}
for (i = low,j=mid+1,k=i;i<=mid&&j<=high; k++)
{
if(b[i]<=b[j])
{
a8[k] = b[i++];
m8++;
b8++;
}
else
{
a8[k] = b[j++];
m8++;
}
b8++;
}
while (i<=mid)
{
a8[k++] = b[i++];
m8++;
}
while (j<=high)
{
a8[k++] = b[j++];
m8++;
}
}
void Sort8(int low,int high)
{
if (low<high)
{
int mid = (low + high) / 2;
Sort8(low, mid);
Sort8(mid + 1, high);
merge(low,mid,high);
}
return;
}
int main()
{
int n, i;
printf("请输入要产生的随机数的数目:");
scanf_s("%d",&n);
for (i = 1; i <= n; i++)
{
k[i] = (rand() % 2000) + 1;
}
Sort1(n);
printf("\n");
Sort2(n);
printf("\n");
Sort3(n);
printf("\n");
Sort4(n);
printf("\n");
for (int t = 0; t < n + 1; t++)
{
a5[t] = k[t];
}
Sort5(1, n);
printf("快速排序\n");
printf("比较次数:%d 移动次数:%d", b5, m5);
printf("\n");
Sort6(n);
printf("\n");
Sort7(n);
printf("\n");
for (int t = 0; t < n + 1; t++)
{
a8[t] = k[t];
}
Sort8(1, n);
printf("归并排序\n");
printf("比较次数:%d 移动次数:%d", b8, m8);
printf("\n");
return 0;
}
内部排序-8种
最新推荐文章于 2024-02-19 18:10:27 发布