数据结构:直接插入排序与折半插入排序

利用静态查找表直接插入排序、折半插入排序。

输入:输入包括多行,每行代表一定的含义

输入1,创建静态查找表,接着输入n表示查表中元素个数,再输入n个整数

输入2 1,代表使用插入排序,按照升序排序;

输入2 -1,代表使用插入排序,按照降序排序;

输入3,代表使用折半插入排序,按照升序排序;

输入0,程序结束。

输出

按照输入的顺序依次输出相关信息。

1
3
101
105
102
2 1
0

样例输出

101
102
105
#include <stdio.h>
#include<iostream>
using namespace std;
#define MAXSIZE 20 //记录最大个数
typedef struct {
	int data[MAXSIZE + 1]; //data[0]可闲置或作监视哨
	int length; //顺序表长度
}SqList;

//创建顺序表
void CreateSqList(SqList& L, int n) {
	int i;
	L.length = n;
	for (i = 1; i <= L.length; i++) {
		scanf("%d", &L.data[i]);
		getchar();
	}
}

//输出顺序表
void PrintSqList(SqList& L) {
	int i;
	for (i = 1; i <= L.length; i++)
		printf("%d\n", L.data[i]);
}

//直接插入排序,Acc=1表示升序,Acc=-1表示降序
void InsertSort(SqList& L, int Acc) {
	int i, j;
	if (Acc == 1) {
		for (i = 2; i <= L.length; i++)
		{
			if (L.data[i] < L.data[i - 1])
			{
				L.data[0] = L.data[i];
				for (j = i - 1; L.data[j] > L.data[0]; j--)
					L.data[j + 1] = L.data[j];
				L.data[j + 1] = L.data[0];
			}
		}
	}
	if (Acc == -1) 
	{
		for (i = 2; i <= L.length; i++)
		{
			if (L.data[i] > L.data[i - 1])
			{
				L.data[0] = L.data[i];
				for (j = i - 1; L.data[j] < L.data[0]; j--)
					L.data[j + 1] = L.data[j];
				L.data[j + 1] = L.data[0];
			}
		}
	}
}

//折半插入排序
void BInsertSort(SqList& L) {
	for (int i = 2; i <= L.length; i++) 
	{
		L.data[0] = L.data[i];
		int low = 1, high = L.length ;
		while (low <= high) 
		{
			int m = (low + high) / 2;
			if (L.data[0] < L.data[m])
				high = m - 1;
			else
				low = m + 1;
		}
		for (int j = i - 1; j >= high + 1; j--)
			L.data[j + 1] = L.data[j];
		L.data[high + 1] = L.data[0];
	}
}

//主函数
int main() {
	int n, Acc;
	SqList List, TempList;
	int select;

	while (scanf("%d", &select) != EOF) {
		getchar();
		if (select == 0)
			return 0;
		else if (select == 1) {
			scanf("%d", &n);
			CreateSqList(List, n);
		}
		if (select == 2) {
			TempList = List;
			scanf("%d", &Acc);
			getchar();
			InsertSort(TempList, Acc);
			PrintSqList(TempList);
		}
		else if (select == 3) {
			TempList = List;
			BInsertSort(TempList);
			PrintSqList(TempList);
		}
	}
	return 0;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值