冒泡排序,快速排序和堆排序 C语言实现(湖北汽车工业学院数据结构实验)

冒泡排序算法,完成对数组list中的index个数进行排序。

// An highlighted block
void bubbleSort(int *list, int index)         
{                           
int i,j,a;
for(i=0;i<index;i++)

       for(j=0;j<index-1;j++)
	   {
		   if(list[j]>list[j+1])
		   {
              a=list[j];
			  list[j]=list[j+1];
			  list[j+1]=a;
		   }
	   }
}
// An highlighted block
int Partition(int *list,int i,int j)
{
	int temp=list[i];
	while(i<j)
	{
		while(list[j]>=temp&&i<j)
			j--;
		if(i<j)
			list[i++]=list[j];
		while(list[i]<=temp&&i<j)
			i++;
		if(i<j)
			list[j--]=list[i];
	}

	list[i]=temp;
	return i;
}

//利用快速排序算法,完成对数组list中的index个数进行排序。

// An highlighted block
void QuickSort(int *list,int left,int right,int index)
{   
	int i;
	int k;
	for(i=0;i<index;i++)
		printf("%5d",list[i]);
	    printf("\n");
	
	if(left<right)
	{
		k=Partition(list,left,right);
		QuickSort(list,left,k-1,index);
		QuickSort(list,k+1,right,index);

	}
}




void produce_data(int data[],int num) //随机产生一批数
{   
   int i;
   srand((unsigned)time(NULL)); 
   for(i=0;i<num;i++)   
       data[i]=rand()%100; 
}

void produce1_data(int data[],int num) //随机产生一批数
{                //专门用于堆排序,数据从data[1]开始存放
   int i;
   srand((unsigned)time(NULL)); 
   for(i=1;i<=num;i++)   
       data[i]=rand()%100; 
}

void print_data(int data[],int num)   //输出数据
{
	int i;
	int count;
	for(i=0;i<num;i++)
	{
		printf("%5d",data[i]);
	    count++;
		if(count%10==0)
			printf("\n");
	}
}

void print1_data(int data[],int num)   //输出数据
{          //专门用于堆排序,数据从data[1]开始输出
	int i;
	int count;
	for(i=1;i<=num;i++)
	{
		printf("%5d",data[i]);
	    count++;
		if(count%10==0)
			printf("\n");
	}
}

void createHeap (int *heap, int root, int index)
{   int i,j;
    int temp;            //于数值交换时的暂存变量
    int finish;          //判断堆是否建立完成

    j=2*root;            //子结点的index         
    temp=heap[root];     //暂存heap的root值     
    finish=0;            //默认堆建立尚未完成 

    while (j<=index && finish==0)
    {
        //找最大的子结点
        if (j<index)
            if (heap[j]<heap[j+1])
                j++;
        if (temp>=heap[j])
            finish=1;             //堆建立完成
        else
        {
            heap[j/2]=heap[j];    //父结点=目前结点
            j=2*j;
        }
    }
    heap[j/2]=temp;               //父结点=root值
}
//堆排序程序构思:                                   
//1.读取数值存入二叉树数组list中                 
//2.将二叉树转成最大堆                         
//3.堆的最大值和数组最后一个数值交换             
//4.其余数值进行堆重建,并打印目前排序结果     
//5.重复3、4,直到所有值均已排序完成           
//6.打印最终排序结果                             
void HeapSort(int *heap,int index)
{                                   //堆排序
	int i,j,temp;
    for(i=(index/2);i>=1;i--)       //将二叉树转成heap
        createHeap(heap,i,index);
    for(i=index-1;i>=1;i--)         //开始进行堆排序
    {
        temp=heap[i+1];             //heap的root值和最后一个值交换
        heap[i+1]=heap[1];
		heap[1]=temp;
        createHeap(heap, 1, i);     //对其余数值重建堆*/
        printf("\n目前的排序为:");    //打印堆处理过程*/
        for(j=1;j<=index;j++)
            printf("%3d",heap[j]);
            //printf("\n");
    }
}

void showmenu()
{          //显示菜单
	printf("    欢迎使用数据排序小软件\n");
	printf("\t1、冒泡排序\n");
	printf("\t2、快速排序\n");
	printf("\t3、堆排序\n");
	printf("\t4、退出程序\n");	
}

void main()
{
    int list[MAX];                    //默认数组最大长度为20
    int i,num;                        //数组索引/
    int node;                         //读入输入值所使用的暂存变量
    int choice;
	while(1)
	{
		showmenu();
		printf("    请输入你的选择:");
		scanf("%d",&choice);
		switch(choice)
		{
		    case 1:	printf("请输入需要排序的元素个数:");
					scanf("%d",&num);
					produce_data(list,num);
					printf("排序前的数据为:\n");
					print_data(list,num);
					bubbleSort(list,num);
					printf("\n最终的排序结果为:\n");
					print_data(list,num);
					printf("\n");
					system("pause");
	                system("cls");
					break;
			case 2:printf("请输入需要排序的元素个数:");
				   scanf("%d",&num);
				   produce_data(list,num);
				   printf("排序前的数据为:\n");
				   print_data(list,num);
				   printf("\n排序过程如下:\n");
				   QuickSort(list,0,num-1,num);
				   printf("\n最终的排序结果为:\n");
				   print_data(list,num);
				   printf("\n");
				   system("pause");
				   system("cls");
				   break;
			case 3:printf("请输入需要排序的元素个数:");
				   scanf("%d",&num);
				   produce1_data(list,num);
				   printf("排序前的数据为:\n");
				   print1_data(list,num);
				   printf("\n排序过程如下:\n");
				   HeapSort(list,num);
				   printf("\n最终的排序结果为:\n");
				   print1_data(list,num);
				   printf("\n");
				   system("pause");
				   system("cls");
				   break;
			case 4:
				   return;
			default:
				printf("你的选择有误,请从新输入!\n");
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值