c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx

上传人:b****6 文档编号:6968944 上传时间:2023-01-13 格式:DOCX 页数:10 大小:18.44KB
下载 相关 举报
c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx_第1页
第1页 / 共10页
c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx_第2页
第2页 / 共10页
c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx_第3页
第3页 / 共10页
c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx_第4页
第4页 / 共10页
c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx

《c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx》由会员分享,可在线阅读,更多相关《c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx(10页珍藏版)》请在冰豆网上搜索。

c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx

c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序

/*Note:

YourchoiceisCIDE*/

#include"stdio.h"

#include"stdlib.h"

#defineMAX4

voidSequenceSearch(int*fp,intLength);

voidSearch(int*fp,intlength);

voidSort(int*fp,intlength);

/*

================================================

功能:

选择排序

输入:

数组名称(也就是数组首地址)、数组中元素个数

================================================

*/

voidselect_sort(int*x,intn)

{

         inti,j,min,t;

     for(i=0;i

0~n-2共n-1次*/

     {

          min=i;/*假设当前下标为i的数最小,比较后再调整*/

          for(j=i+1;j

          {

               if(*(x+j)<*(x+min))

               {   

                    min=j;/*如果后面的数比前面的小,则记下它的下标*/

               }

      }        

      if(min!

=i)/*如果min在循环中改变了,就需要交换数据*/

      {

           t=*(x+i);

           *(x+i)=*(x+min);

           *(x+min)=t;

      }

     }

}

/*

================================================

功能:

直接插入排序

输入:

数组名称(也就是数组首地址)、数组中元素个数

================================================

*/

voidinsert_sort(int*x,intn)

{

inti,j,t;

for(i=1;i

1~n-1共n-1次*/

{

  /*

   暂存下标为i的数。

注意:

下标从1开始,原因就是开始时

   第一个数即下标为0的数,前面没有任何数,单单一个,认为

   它是排好顺序的。

  */

  t=*(x+i);

    for(j=i-1;j>=0&&t<*(x+j);j--)/*注意:

j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。

*/

      {

        *(x+j+1)=*(x+j);/*如果满足条件就往后挪。

最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/

      }

  *(x+j+1)=t;/*找到下标为i的数的放置位置*/

}

}

/*

================================================

功能:

冒泡排序

输入:

数组名称(也就是数组首地址)、数组中元素个数

================================================

*/

voidbubble_sort(int*x,intn)

{

intj,k,h,t;  

for(h=n-1;h>0;h=k)/*循环到没有比较范围*/

{

  for(j=0,k=0;j

  {

    if(*(x+j)>*(x+j+1))/*大的放在后面,小的放到前面*/

      {

        t=*(x+j);

        *(x+j)=*(x+j+1);

        *(x+j+1)=t;/*完成交换*/

        k=j;/*保存最后下沉的位置。

这样k后面的都是排序排好了的。

*/

      }

   }

}

}

/*

================================================

功能:

希尔排序

输入:

数组名称(也就是数组首地址)、数组中元素个数

================================================

*/

voidshell_sort(int*x,intn)

{

inth,j,k,t;

for(h=n/2;h>0;h=h/2)/*控制增量*/

{

  for(j=h;j

  {

   t=*(x+j);

    for(k=j-h;(k>=0&&t<*(x+k));k-=h)

     {

      *(x+k+h)=*(x+k);

     }

   *(x+k+h)=t;

  }

}

}

/*

================================================

功能:

快速排序

输入:

数组名称(也就是数组首地址)、数组中起止元素的下标

================================================

*/

voidquick_sort(int*x,intlow,inthigh)

{

inti,j,t;

if(low

这里以下标为low的元素为基准点*/

{

  i=low;

  j=high;

  t=*(x+low);/*暂存基准点的数*/

  while(i

  {

     while(it)/*在右边的只要比基准点大仍放在右边*/

       {

        j--;/*前移一个位置*/

       }

   if(i

     {

        *(x+i)=*(x+j);/*上面的循环退出:

即出现比基准点小的数,替换基准点的数*/

        i++;/*后移一个位置,并以此为基准点*/

     }

   while(i

   {

    i++;/*后移一个位置*/

   }

   if(i

   {

    *(x+j)=*(x+i);/*上面的循环退出:

即出现比基准点大的数,放到右边*/

    j--;/*前移一个位置*/

   }

  }

  *(x+i)=t;/*一遍扫描完后,放到适当位置*/

  quick_sort(x,low,i-1);  /*对基准点左边的数再执行快速排序*/

  quick_sort(x,i+1,high);  /*对基准点右边的数再执行快速排序*/

}

}

/*

================================================

功能:

堆排序

输入:

数组名称(也就是数组首地址)、数组中元素个数

================================================

*/

/*

功能:

渗透建堆

输入:

数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始

*/

voidsift(int*x,intn,ints)

{

intt,k,j;

t=*(x+s);/*暂存开始元素*/

k=s;  /*开始元素下标*/

j=2*k+1;/*右子树元素下标*/

while(j

{

  if(j

满足就继续下一轮比较,否则调整。

*/

  {

   j++;

  }

  if(t<*(x+j))/*调整*/

  {

   *(x+k)=*(x+j);

   k=j;/*调整后,开始元素也随之调整*/

   j=2*k+1;

  }

  else/*没有需要调整了,已经是个堆了,退出循环。

*/

  {

   break;

  }

*(x+k)=t;/*开始元素放到它正确位置*/

}

/*

功能:

堆排序

输入:

数组名称(也就是数组首地址)、数组中元素个数

*/

voidheap_sort(int*x,intn)

{

inti,k,t;

//int*p;

for(i=n/2-1;i>=0;i--)

{

  sift(x,n,i);/*初始建堆*/

for(k=n-1;k>=1;k--)

{

  t=*(x+0);/*堆顶放到最后*/

  *(x+0)=*(x+k);

  *(x+k)=t;

  sift(x,k,0);/*剩下的数再建堆*/ 

}

}

/*构造随机输出函数类*/

voidinput(inta[]){

inti;

srand((unsignedint)time(NULL));

for(i=0;i<4;i++)

{

  a[i]=rand()%100;

}

printf("\n");

}

/*构造键盘输入函数类*/    

/*voidinput(int*p)

{

    inti;

    printf("请输入%d个数据:

\n",MAX);

     for(i=0;i

     {

      scanf("%d",p++); 

     }

     printf("\n");

}*/

/*构造输出函数类*/

voidoutput(int*p)

{

    inti;

    for(i=0;i

       {

          printf("%d",*p++);

       }    

}

//归并排序中的合并算法

voidMerge(inta[],intstart,intmid,intend)

{

    inti,k,j,temp1[10],temp2[10];

    intn1,n2;

    n1=mid-start+1;

    n2=end-mid;

    //拷贝前半部分数组

    for(i=0;i

    {

        temp1[i]=a[start+i];

    }

    //拷贝后半部分数组

    for(i=0;i

    {

        temp2[i]=a[mid+i+1];

    }

    //把后面的元素设置的很大

    temp1[n1]=temp2[n2]=1000;

    //逐个扫描两部分数组然后放到相应的位置去

    for(k=start,i=0,j=0;k<=end;k++)

    {

        if(temp1[i]<=temp2[j])

        {

            a[k]=temp1[i];

            i++;

        }

        else

        {

            a[k]=temp2[j];

            j++;

        }

    }

}

//归并排序

voidMergeSort(inta[],intstart,intend)

{

    if(start

    {

        inti;

        i=(end+start)/2;

        //对前半部分进行排序

        MergeSort(a,start,i);

        //对后半部分进行排序

        MergeSort(a,i+1,end);

        //合并前后两部分

        Merge(a,start,i,end);

    }

}

/*顺序查找*/

voidSequenceSearch(int*fp,intLength)

{

inti;

intdata;

printf("开始使用顺序查询.\n请输入你想要查找的数据.\n");

scanf("%d",&data);

for(i=0;i

  if(fp[i]==data)

  {

   printf("经过%d次查找,查找到数据%d,表中位置为%d.\n",i+1,data,i);

   return;

  } 

printf("经过%d次查找,未能查找到数据%d.\n",i,data);

}

/*二分查找*/

voidSearch(int*fp,intLength)

{

intdata;

  intbottom,top,middle;

   inti=0;

printf("开始使用二分查询.\n请输入你想要查找的数据.\n");

scanf("%d",&data);

printf("由于二分查找法要求数据是有序的,现在开始为数组排序.\n");

Sort(fp,Length);

printf("数组现在已经是从小到大排列,下面将开始查找.\n");

bottom=0;

top=Length;

while(bottom<=top)

{

  middle=(bottom+top)/2;

  i++;

  if(fp[middle]

  {

   bottom=middle+1;

  }

  elseif(fp[middle]>data)

  {

   top=middle-1;

  }

  else

  {

   printf("经过%d次查找,查找到数据%d,在排序后的表中的位置为%d.\n",i,data,middle);

   return;

  }

}

printf("经过%d次查找,未能查找到数据%d.\n",i,data);

}

voidSort(int*fp,intLength)

{

inttemp;

inti,j,k;    

printf("现在开始为数组排序,排列结果将是从小到大.\n");

for(i=0;i

  for(j=0;j

   if(fp[j]>fp[j+1])

   {

    temp=fp[j];

    fp[j]=fp[j+1];

    fp[j+1]=temp;

   }

   printf("排序完成!

\n下面输出排序后的数组:

\n");

   for(k=0;k

   {

    printf("%5d",fp[k]);

   }

   printf("\n");

   

}

voidmain()

intstart=0,end=3;

int*p,i,a[MAX];

intcount=MAX;

intarr[MAX];

intchoise=0;

/*printf("请输入你的数据的个数:

\n");

scanf("%d",&count);*/

/*printf("请输入%d个数据\n",count);

for(i=0;i

{

  scanf("%d",&arr[i]);

}*/

/*录入测试数据*/

     input(a);

     printf("随机初始数组为:

\n");

     output(a);

     printf("\n");

do 

  printf("1.使用顺序查询.\n2.使用二分查找法查找.\n3.退出\n");

  scanf("%d",&choise);

  if(choise==1)

   SequenceSearch(a,count);

  elseif(choise==2)

   Search(a,count);

  elseif(choise==3)

   break; 

}while(choise==1||choise==2||choise==3);

/*录入测试数据*/

     input(a);

     printf("随机初始数组为:

\n");

     output(a);

     printf("\n");

/*测试选择排序*/

p=a;

printf("选择排序之后的数据:

\n");

select_sort(p,MAX);

output(a);

printf("\n");

system("pause");

/**/

/*录入测试数据*/

input(a);

printf("随机初始数组为:

\n");

     output(a);

     printf("\n");

/*测试直接插入排序*/

printf("直接插入排序之后的数据:

\n");

p=a;

insert_sort(p,MAX);

output(a);

printf("\n");

system("pause");

/*录入测试数据*/

input(a);

printf("随机初始数组为:

\n");

     output(a);

     printf("\n");

/*测试冒泡排序*/

printf("冒泡排序之后的数据:

\n");

p=a;

insert_sort(p,MAX);

output(a);

printf("\n");

system("pause");

/*录入测试数据*/

input(a);

printf("随机初始数组为:

\n");

     output(a);

     printf("\n");

/*测试快速排序*/

printf("快速排序之后的数据:

\n");

p=a;

quick_sort(p,0,MAX-1);

output(a);

printf("\n");

system("pause");

/*录入测试数据*/

input(a);

printf("随机初始数组为:

\n");

     output(a);

     printf("\n");

/*测试堆排序*/

printf("堆排序之后的数据:

\n");

p=a;

heap_sort(p,MAX);

output(a);

printf("\n");

system("pause");

/*录入测试数据*/

input(a);

printf("随机初始数组为:

\n");

     output(a);

     printf("\n");

/*测试归并排序*/

printf("归并排序之后的数据:

\n");

p=a;

MergeSort(a,start,end);

output(a);

printf("\n");

system("pause");

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1