代码段:
#include
#include
#define ElemType int
#define MaxSize 50
ElemType A[MaxSize];
void InsertSort1(ElemType A[], int n)//直接插入排序
{
int j = 0, i = 0;
for (i = 2; i <= n; i++)//依次将A[2]-A[n]插入前面已近排序的序列
{
if (A[i] < A[i - 1])//若关键码A[i]小于其前驱A[i-1],将A[i]插入有序序列
{
A[0] = A[i];//复制A[0]为哨兵,A[0]不存放元素
for (j = i - 1; A[0] < A[j]; j--)//从后往前寻找待插入的位置
{
A[j + 1] = A[j];//元素后移
}
A[j+1] = A[0];//复制到插入的位置
}
}
}
void Print1(ElemType A[],int n)//打印数组元素A[1]-A[n],A[0]不存放元素,为哨兵
{
int i = 1;
for (i = 1; i <= n; i++)
{
printf("%d ", A[i]);
}
}
void Print2(ElemType A[], int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", A[i]);
}
}
void InsertSort2(ElemType A[], int n)//折半插入排序
{
int i = 0, j = 0, low = 0, high = 0, mid = 0;
for (i = 2;i <= n; i++)//依次将A[2]-A[n]插入到前面已近拍好的序列
{
A[0] = A[i];//将A[i]暂时存到A[0]
low = 1;//low为查找的左边地址,high为查找的右边地址
high = i - 1;
while (low <= high)//折半查找
{
mid = (low + high) / 2;//取中间点
if (A[mid] > A[0])//查找左边部分
high = mid - 1;
else//查找右边部分
low = mid + 1;
}
for (j = i - 1; j >= high + 1; j--)
{
A[j + 1] = A[j];//元素后移
}
A[j + 1] = A[0];//插入操作
}
}
void ShellSort(ElemType A[], int n)//希尔排序
{
int i = 0, j = 0, dk = 0;
for (dk = n / 2; dk >= 1; dk = dk / 2)//步长变化
{
for (i = dk + 1; i <=n; i++)//将A[i]插入有序增量表
{
if (A[i] < A[i - dk])
{
A[0] = A[i];//将A[i]暂存A[0]
for (j = i - dk; j > 0 && A[0] < A[j]; j = j - dk)
A[j + dk] = A[j];//元素后移
A[j + dk] = A[0];//插入
}//if
}//for
}//for
}
void Swap(ElemType& a, ElemType& b)//交换a,b两元素的值
{
ElemType temp = a;
a = b;
b = temp;
}
void BubbleSort(ElemType A[], int n)//冒泡排序
{
int i = 0, j = 0;
for (i = 0; i < n-1; i++)
{
bool flag = false;//冒泡排序的标志
for (j = n - 1; j > i; j--)//一趟冒泡排序
{
if (A[j - 1] > A[j])//若为逆序,则交换
{
Swap(A[j - 1], A[j]);
flag = true;
}
}
if (flag == false)
return;
}
}
int Partition(ElemType A[], int low, int high)//一趟划分
{
ElemType pivod = A[low];//将表中第一个元素设置为枢纽,对表进行划分
while (low < high)
{
while (low < high && A[high] >= pivod)//将比枢纽小的元素移动到左端
high--;
A[low] = A[high];
while (low < high && A[low] <= pivod)//将比枢纽大的元素移动到右端
low++;
A[high] = A[low];
}
A[low] = pivod;//枢纽元素最终存放的位置
return low;
}
void QuickSort(ElemType A[],int low,int high)//快速排序
{
if (low < high)
{
int pivotpos = Partition(A, low, high);
QuickSort(A, low, pivotpos - 1);//左边部分
QuickSort(A, pivotpos + 1, high);//右边部分
}
}
int main()
{
int n = 8;
ElemType A[] = { 0,7,8,9,2,5,1,3,6 };//插入排序,0号位置不储存元素
ElemType B[] = { 7,8,9,2,5,1,3,6 };//交换排序
printf("排序前的元素:\n");
Print2(B, n);
while (true)
{
printf("\n\n**************请输入需要的操作:**************\n");
printf(" 操作1:直接插入排序\n");
printf(" 操作2:折半插入排序\n");
printf(" 操作3:希尔排序\n");
printf(" 操作4:冒泡排序\n");
printf(" 操作5:快速排序\n");
printf(" 操作-1:退出\n");
int count = 0, low = 0, high = 0;
printf("*操作:");
scanf_s("%d", &count);
if (count == -1)
break;
switch (count)
{
case 1:
printf("直接插入排序:\n");
InsertSort1(A, n);
Print1(A, n);
printf("\n");
break;
case 2:
printf("折半插入排序:\n");
InsertSort2(A, n);
Print1(A, n);
printf("\n");
break;
case 3:
printf("希尔排序:\n");
ShellSort(A, n);
Print1(A, n);
printf("\n");
break;
case 4:
printf("冒泡排序:\n");
BubbleSort(B, n);
Print2(B, n);
printf("\n");
break;
case 5:
printf("快速排序:\n");
low = 0;
high = n - 1;
QuickSort(B, low, high);
Print2(B, n);
printf("\n");
}
}
return 0;
}