插入排序:直接插入排序,折半插入排序,希尔排序;交换排序:冒泡排序,快速排序;

代码段:

#include<stdio.h>
#include<stdbool.h>
#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;
}

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值