当前位置:编程学习 > C/C++ >>

用冒泡法、简单插入和简单选择三种方式实现排序,每种排序过程中需要打印出循环执行的次数。

排序的初始数列为:(10,4,5,1,8,4,9,3)
追问:这不是不想让老师不好意思么,我就问问~
答案:你分数太低,我把以前写的给你,自己修改选择排序:#include"stdio.h"
int main()
{
 int array[6]={24,70,12,85,106,8};
 int i,j,n=0,middle,sub,min;
 for(j=0;j<6;j++)
 {
 min=array[n];
 for(i=n;i<6;i++)
 {
  if(min>array[i])
  {
   min=array[i];
         sub=i;
  }
 }
    middle=array[n];
 array[n]=array[sub];
 array[sub]=middle;
 n++;
 }
    for(j=0;j<6;j++)
 printf("%d ",array[j]); 
 printf("\n");
 return 0;
} 
 
 
 
 
直接插入排序,不过是动态链表的
#define null 0
#include"stdio.h"
#include"malloc.h"
struct student 
{
int num;
struct student *next;
};
int n=0;

 
struct student *create(void)
{
struct student *head,*p1,*p2;
p1=p2=(struct student*)malloc(sizeof(struct student));
head=null;
scanf("%d",&p1->num);
while(p1->num!=null)
{
n=n+1;
if(n==1)head=p1;
p1=(struct student*)malloc(sizeof(struct student));
p2->next=p1;
p2=p1;
scanf("%d",&p1->num);
}
p1->next=null;
return(head);
}
/*------------------
   动态链表的建立
-------------------*/

 
struct student *paixu(struct student *head)
{
struct student *listp,*limbo,*listx; 
/*----------------------------------------------------------------------------------------------------------
   1.listP为无序区链表的遍历指针,作提取节点和有序区比较的作。
   2.limbo为过渡指针,每当无序区遍历到的节点值小于有序区节点遍历到的值,则节点插到有序区链表的最后面,并且把
     此节点的next地址设定为null,next为null为有序区链表遍历结束的条件,为了不使无序区的节点失去联系,需要把此
  节点next的值赋值给limbo,再把null赋值给next,把limbo的值赋值给listp,使listP指向无序区下一个需要插入节点。
   3.listx为有序区链表的便利指针,listx->next=null为遍历结束的标示。
------------------------------------------------------------------------------------------------------------*/
listp=limbo=listx=head;
if(listp->num!=null)
{
listp=listp->next;
head->next=null;
}
else printf("链表为空,无法排序");
/*-----------------------------------------------------------------------------------------
   把第一个节点放入有序区,listp指向下一个需要比较的节点,然后把刚放入有序的阶段的next设为null。
-------------------------------------------------------------------------------------------*/
if(listp->num!=null)
{
if(listp->num>head->num)
{
limbo=listp->next;
listp->next=head;
head=listp;
listp=limbo;
}
else
{
head->next=listp;
limbo=listp->next;
listp->next=null;
listp=limbo;
}
}
/*------------------------------------------------------------------------------------------------
 第二个节点放入有序区,如果大于有序区的首节点,就让有序区的头指针指向它,指针listP指向下一个需要
 比较的节点;否则就把节点的next设置为null,在让指针p指向下一个需要比较的节点(利用过渡节点limbo)。
-------------------------------------------------------------------------------------------------*/
while(listp->num!=null)
{
listx=head;
while(listx->next!=null)
{
if(listp->num>listx->num)
{
limbo=listp->next;
listp->next=head;
head=listp;
listp=limbo;
break;
} 
if(listp->num>=listx->next->num&&listp->num<=listx->num)
{
limbo=listp->next;
listp->next=listx->next;
listx->next=listp;
listp=limbo;
break;
}
else
{
listx=listx->next;
}
}
if(listx->next==null&&listp->num<listx->num)
{
listx->next=listp;
limbo=listp->next;
listp->next=null;
listp=limbo;
}
}
/*--------------------------------------------------------------------------------------------------------------------------------
 把其余节点依次放入有序区,
 如果大于有序区的首节点,就让有序区的头指针指向它,指针listP指向下一个需要比较的节点;
 如果小于有序区的当前尾节点,插入在有序区链表尾部,把节点的next设置为null,让指针listp指向下一个需要比较的节点(用过渡节点limbo);
 如果小于等于当前listx指向的节点并且大于等于listx->next指向的节点,就插入他们中间。
---------------------------------------------------------------------------------------------------------------------------------*/
return(head);
/*-------------------------
 把head的值返回给函数。
--------------------------*/
}
int print(struct student *head)
{
struct student *y;
y=head;
while(y)
{
printf("%d ",y->num);
y=y->next;
}
return 0;
}
/*--------------
     链表输出
---------------*/

 
int main(void)
{
struct student *head,*a;
head=create();
a=paixu(head);
print(a);
return 0;
}
 
冒泡排序么有,因为是诸多排序中算法最简单的,懒得写,你可以去华夏联盟问问,里面很多高中帮助你
其他:自己的作业题还好意思拿出来.

上一个:哪位大虾给我详述下,c语言,c++ java c# vb这几种语言的区别与相同之处。分别适合写什么样的程序?
下一个:你好,你有福建c语言二级考试的试题与答案吗?发给我可以吗?2680724224@qq.com谢谢

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,