线性表创建插入删除及各种排序算法实现

常用排序算法基本思想:

1.直接插入排序:是一种稳定的排序方法,其时间复杂度为O(n^2),空间复杂度为O(1),具体做法是:在插入第i个记录是,R1,R2,...,R(i-1)已经排好序,这时将Ri的关键字Ki依次与关键字K(i-1),K(i-2)等进行比较,从而找到应该插入的位置并将Ri插入,插入位置及其后的记录依次向后移动。

2.冒泡排序:

3.简单选择排序:是一种不稳定排序,(因为原数据为:4,6,3,4,1,其中第一次比较时,第一个4和最后一个1交换,这样两个4的前后位置变化了,是不稳定排序),其时间复杂度为O(n^2),空间复杂度为O(1),具体做法是:通过n-i(1<=i<=n)次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换,当i等于n时所有记录有序排序。

4.希尔排序:

5.快速排序:

6.堆排序:

7.归并排序:

8.基数排序:

#include "stdio.h"
#include "malloc.h"

int *InitList(int *LineList, int n);
int *InsertData(int *LineList, int *n);
int *DelteData(int *LineList, int *n);
int FindData(int *LineList, int n);
//排序算法
int *BubbleSort(int *LineList, int n);
int *QuickSort(int *LineList, int low, int high);
int *SelectSort(int *LineList, int n);
int *InsertSort(int *LineList, int n);
int *ShellSort(int *LineList, int n);
int *HeapSort(int *LineList, int n);

void outputList(int *LineList, int n);
void menu(void);

int main()
{
	int *LineList = NULL; //线性表
	int *n;  //线性表中*n个数据
	int operateNum;
	int Data;
	//初始化线性表
	n = (int *)malloc(sizeof(int));
	printf("输入线性表中数据个数: ");
	scanf("%d",n);
	LineList = InitList(LineList, *n);

	//线性表操作菜单
    menu();
	printf("输入相关操作:");
	scanf("%d",&operateNum);

	switch (operateNum)
	{
	case 1:
		InsertData(LineList, n);
		break;
	case 2:
		DelteData(LineList, n);
		break;
	case 3:
		Data = FindData(LineList, *n);
		printf("查找的数据为:%d\n",Data);
		break;
	case 4:
		BubbleSort(LineList, *n);
		break;
	case 5:
		QuickSort(LineList, 0, *n-1);//0为首地址坐标,*n-1为末尾地址坐标
		break;
	case 6:
		SelectSort(LineList, *n);
		break;
	case 7:
		InsertSort(LineList, *n);
		break;
	case 8:
		ShellSort(LineList, *n);
		break;
	case 9:
		HeapSort(LineList, *n);
		break;
	case 0:
		break;
	default:
		printf("请输入[0,9]\n");
		menu();
		printf("输入相关操作:");
		scanf("%d",&operateNum);
	}
	
		
	//输出线性表中数据
	outputList(LineList, *n);
	
	return 1;
}
//初始化线性表
int *InitList(int *LineList, int n)
{
	LineList = (int *)malloc(n*sizeof(int));
	for(int i = 0; i < n; i++)
	{
		printf("输入第 %d 个数据:",i+1);
		scanf("%d", LineList+i);
	}
	return LineList;
}
//输出线性表中数据
void outputList(int *LineList, int n)
{
	printf("最终线性表中数据为:\n");
	for(int i = 0; i < n; i++)
	{
		printf("%d ",*(LineList+i));
		if(0 == (i+1)%10)
		{
			printf("\n");
		}
	}
	printf("\n");
}
//菜单
void menu()
{
	printf("-------------选择相关操作--------------\n");
	printf("***********插入数据请输入:1 **********\n");
	printf("***********删除数据请输入:2 **********\n");
	printf("***********查找数据请输入:3 **********\n");
	printf("***********冒泡排序请输入:4 **********\n");
	printf("***********快速排序请输入:5 **********\n");
	printf("***********选择排序请输入:6 **********\n");
	printf("***********插入排序请输入:7 **********\n");
	printf("***********希尔排序请输入:8 **********\n");
    printf("*********** 堆 排序请输入:9 **********\n");
	printf("***********  退出  请输入:0 **********\n");
	printf("---------------------------------------\n");
}
//插入数据
int *InsertData(int *LineList, int *n)
{
	int i, Data;
	printf("请输入在第 i个位置插入的数据 Data: ");
	scanf("%d,%d",&i,&Data);
    if (i<1 || i>*n)
	{
		printf("请输入插入位置在[1,n]之间\n");
        return 0;
    }
    *n = *n+1;
	for(int k = *n; k >= i; k--)
	{
		*(LineList+k) = *(LineList+k-1);
	}
	*(LineList+i-1) = Data;
	return LineList;
}
//删除数据
int *DelteData(int *LineList, int *n)
{
	int i;
	printf("请输入要删除第 i 个位置的数据:");
	scanf("%d",&i);
	if (i<1 || i>*n)
	{
		printf("请输入删除位置在[1,n]之间\n");
		return 0;
	}
	for(int k = i-1; k < *n; k++)
	{
		*(LineList+k) = *(LineList+k+1);
	}
	*n = *n-1;
	return LineList;
}
//查找数据
int FindData(int *LineList, int n)
{
   int i, Data;
   printf("请输入查找的数据位置:\n");
   scanf("%d",&i);
   if (i<1 || i>n)
   {
	   printf("请输入数据在[1,n]之间\n");
	   return 0;
   }
   return Data=*(LineList+i-1);
}
//冒泡法排序(稳定排序)
int *BubbleSort(int *LineList, int n)
{
	int temp;
    for (int i = 0; i < n-1; i++)
	{
		for(int j = i+1; j < n; j++)
		{
			if (*(LineList+i) > *(LineList+j))
			{
				temp = *(LineList+i);
				*(LineList+i) = *(LineList+j);
				*(LineList+j) = temp;
			}
		}
	}
	return LineList;
}
//快速排序算法(不稳定排序)
int *QuickSort(int *LineList, int low, int high)
{
	int i, pivotkey,j;
	if (low < high)
	{
		//以第一个元素为基准
		pivotkey = *(LineList+low);
		i = low;
		j = high;
		while (i < j)
		{
			while (i<j && *(LineList+j)>=pivotkey)
			{
				j--;
			}
			if (i < j)
			{
				*(LineList+i) = *(LineList+j);
				i++;
			}
			while(i<j && *(LineList+i)<=pivotkey)
			{
				i++;
			}
			if (i<j)
			{
				*(LineList+j) = *(LineList+i);
				j--;
			}
		}
		*(LineList+i) = pivotkey;
		QuickSort(LineList, low, i-1);
		QuickSort(LineList, i+1,high);
	}
	return LineList;
}
//简单选择排序算法(不稳定排序)
int *SelectSort(int *LineList, int n)
{
	int k, temp;
	for(int i = 0; i < n-1; i++)
	{
                  k=i;
		for(int j = i+1; j < n; j++)//找到最小值
			if(*(LineList+k) > *(LineList+j))
			{
				k = j;
			}
			if(k != i)
			{
				temp = *(LineList+i);
				*(LineList+i) = *(LineList+k);
				*(LineList+k) = temp;
			}
	}
	return LineList;
}
//直接插入排序(稳定排序)
int *InsertSort(int *LineList, int n)
{
	int i,j,temp;
	for(i = 1; i < n; i++)
	{
       temp = *(LineList+i);
	   j = i-1;
	   while(j>=0 && temp < *(LineList+j))
	   {
		   *(LineList+j+1) = *(LineList+j);
		   j--;
	   }
            *(LineList+j+1) = temp;
	}
	return LineList;
}
//希尔排序(不稳定排序)
int *ShellSort(int *LineList, int n)
{
	int i,k,j,temp;
	for (i = n/2; i > 0; i = i/2)
	{
		for (j = i; j < n; j++)
		{
			temp = *(LineList + j);
			for (k = j-i; k >= 0 && temp < *(LineList + k); k = k-i)
			{
				*(LineList + k + i) = *(LineList + k);
			}
			*(LineList + k + i) = temp;
		}
	}
	return LineList;
}
//堆排序(不稳定排序)
void HeapAdjust(int *LineList, int s, int m)
{
	int temp,j;
	temp = *(LineList+s);
	for (j = 2*s+1; j <= m; j = 2*j+1)
	{
		if(j<m && *(LineList+j)<*(LineList+j+1))
		{
			j++;
		}
		if(!(temp < *(LineList+j)))
		{
			break;
		}
		*(LineList+s) = *(LineList+j);
		s=j;
	}
	*(LineList+s) = temp;
}
int *HeapSort(int *LineList, int n)
{
	int i,temp;
	for(i = n/2-1; i >=0; i--)
	{
		HeapAdjust(LineList, i, n-1);
	}
	for(i = n-1; i > 0; i--)
	{
        temp = *(LineList);
		*(LineList) = *(LineList+i);
		*(LineList+i) = temp;
		HeapAdjust(LineList, 0, i-1);
	}
	return LineList;
}




望各位志同道合博友相互学习,有问题请指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值