几种常见排序算法的实现(C语言实现)

这里我给大家做了4种排序算法的实现,分别是:冒泡排序、选择排序、直接插入排序、快速排序。其中冒泡和选择是用链式结构来实现的,因此我这里先定义了链表的基本结构和创建操作。

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode //定义链表类型
{
	ElemType data;  //数据域 
	struct LNode *next;  //指针域 
	
 }LNode,*LinkList; 
 void CreateList(LinkList &L,int a[],int n) //初始化链表 
 {	int i;
 	LinkList p,r;  //p表示指向当前节点的指针 
 	L=(LinkList )malloc(sizeof(LNode));
 	L->next=NULL;  //建立头结点
 	L->data=0;  //表头数据域放的是长度 
	 r=L; //创建尾结点 
 	for(i=1;i<=n;i++)
 	{
 		p=(LinkList)malloc(sizeof(LNode));  //为新建立的节点申请空间 
 		p->data=a[i];
 		p->next=NULL;
 		L->data++;
 		r->next=p; //把新建的节点放到尾解点之后 
 		r=p; //新建的节点等于尾解点 
	 }
 }
 void print(LinkList L)  //链表的打印函数 
 {  int i;LinkList p;
 	p=L->next;
 	for(i=0;i<L->data;i++)
 	{printf("%d ",p->data);
 	 p=p->next;
	 }
 }
 
int n; 
 void menu()
 {
 	printf("\n            --------------------------------1.冒泡排序-------------------======");
 	printf("\n            --------------------------------2.选择排序-------------------======");
 	printf("\n            =================---------------3.直接插入排序-----------------==--");
 	printf("\n            -=================--------------4.快速排序-------------------======");
 	printf("\n            -=================--------------5.退出系统-------------------======");				
 } 
 
 void bubble() //冒泡排序
 {
    printf("输入要排序的数字个数:");
    scanf("%d",&n);
    int a[n],i;
    printf("输入%d个数:\n",n);
    for(i=1;i<=n;i++)
     scanf("%d",&a[i]);
	LinkList L,p,q;
	CreateList(L,a,n);
	p=L->next;
	while(p!=NULL)
	{
		q=p->next;
		while(q!=NULL)
		{
			if((q->data)<(p->data))
			{ int t;
			  t=q->data;
			  q->data=p->data;
			  p->data=t;
			}
			q=q->next;
		}
		p=p->next;
	} 
   printf("冒泡排序结果为:\n");
   print(L);
 } 
 void select_sort() //选择排序 
 {   
    printf("输入要排序的数字个数:");
    scanf("%d",&n);
    int a[n],i;
    printf("输入%d个数:\n",n);
    for(i=1;i<=n;i++)
     scanf("%d",&a[i]);
    LinkList L,p,q,s;
	CreateList(L,a,n);
	p=L->next;
	while(p!=NULL)
	{
		int min=p->data;
		q=p->next;
		while(q!=NULL)
		{
			if(q->data<min) 
			 { min=q->data;
			   s=q;
			 }
			q=q->next;
		}
		if(min!=p->data)
		{  int t;
		   t=s->data;
		   s->data=p->data;
		   p->data=t;	
		}
		p=p->next;
	}
	printf("选择排序结果为:\n");
   print(L);
 }
 void insert_sort() //直接插入排序 
 {
    int i,j;
     printf("输入要排序的数字个数:");
    scanf("%d",&n);
    int a[n];
    printf("输入%d个数:\n",n);
    for(i=1;i<=n;i++)
     scanf("%d",&a[i]);
	for(i=2;i<=n;i++)
	{
		if(a[i]<a[i-1]) //如果后边元素大 
		{
			a[0]=a[i];   //标记哨兵 
			a[i]=a[i-1]; //元素右移
			for(j=i-2;a[j]>a[0];j--) //找到比a[0]小的位置 
			  a[j+1]=a[j]; //元素依次后移 
			 a[j+1]=a[0]; //在合适位置插入标记的哨兵 
		}
		
	} 	
 	printf("直接插入排序结果为:\n");
 	for(i=1;i<=n;i++)
 	{
 		printf("%d ",a[i]);
 	}
 }
 int partition(int left,int right,int a[])//分治算法 
 {  int pivoktey=a[left],t;//默认左边第一个为枢轴 
    while(left<right)
    {
    	while(left<right&&a[right]>=pivoktey) right--; //从右边找比它小的 
    	{ t=a[left];a[left]=a[right];a[right]=t;  //交换 
    	}
		
    	while(left<right&&a[left]<=pivoktey) left++; //从左边找比他大的 
    	{ t=a[left];a[left]=a[right];a[right]=t;//交换 
    	}
    	
    }
 	return left;//函数结束后已经将小的排在左边  大的排在右边  返回枢轴位置   
 }
 void quick_sort(int a[],int left,int right)
 {
 	int pivotloc;
 	if(left<right)
 	{ pivotloc=partition(left,right,a); //将数组一分为二 
 	  quick_sort(a,left,pivotloc-1); //左边排序
	  quick_sort(a,pivotloc+1,right); //右边排序 
 	}
 }
 void quick()
 {  printf("输入要排序的数字个数:");
    scanf("%d",&n);
    int a[n],i;
    printf("输入%d个数:\n",n);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
	quick_sort(a,1,n);
	printf("快速排序结果为:\n");
	for(i=1;i<=n;i++) 
    printf("%d ",a[i]); 
 }
 int main()
 {	int  i,choice;
     while(1)
     {  menu();
     	printf("\n\n请输入您的选项:\n");
    	 scanf("%d",&choice);
    	 switch(choice)
     	{
     		case 1: bubble();break;
     		case 2:	select_sort();break;
      	    case 3:	insert_sort();break;
		 	case 4:	quick();	 break;	
			case 5: return 0; 
    	 }
     }
    
    return 0;
  } 
  

运行结果为:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
几种常见排序 基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 InsertionSort:每次拿起一个数,插入到它左边数组的正确位置。 1.4 QuickSort:选择一个数,作为标准,小于它的放在左边,大于它的放在右边。并把它放在中间;递归地对左右子数组进行排序。 实现时:1. 确定递归结束条件,初始化左右游标, 选择标准数; 2. while循环,do while实现两个游标同时向中间移动,置换; 3. 置换标准数和右边游标所指的数; 4. 递归调用,对左右子数组进行排序。 1. 5 HeapSort:用最大堆实现实现时:建堆:置换堆顶元素和最后一个元素,堆大小减少,保持新的堆为最大堆; 保持最大堆: 从底向上依次保持最大堆,从第一个父节点到根部。 1.6 MergeSort:拆分数组,递归实现排序,二路归并。用哨兵来阻止游标的越界。 线性时间运行的算法: 1.7 CountingSort: 假设数据分布在0到k之间的。对于每个输入x,确定出小于x的数的个数。假设小于x的数有17个,那么x就应该在第18个输出位置。 1. 8 Radix sort(基数排序):从最低位开始,每位采用稳定的排序算法(如计数排序)。 1.9 Bucket sort:当输入数据比较均匀时采用。 先将数据区间分为n个桶,把数据分放到对应的桶中;对桶内的数据采用插入排序;再把各个桶的排序结果串起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔梦圆的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值