数据结构中的排序查找算法(C语言实现)

直接插入排序

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

typedef struct

{

         int key;

}list;

void Dir_In(list D[],int length)

{

         list dm;

         int k=0;

         for(int i=1;i<length;i++)

         {

                   dm=D[i];k=i-1;

                      while((dm.key<D[k].key)&& (k>=0))

                       {

                             D[k+1]=D[k];

                             k--;

                       }

                      D[k+1]=dm;

                   }

 

}

void main()

{

         int a[10]={10,1,9,4,3,6,11,21,36,15};

         list D[10];

         for(int i=0;i<10;i++)

                   D[i].key=a[i];

         Dir_In(D,10);

         for(int i=0;i<10;i++)

                   cout<<D[i].key<<endl;

      }

 

直接选择排序:

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

typedef struct

{

         int key;

}list;

void Direct(list D[],int low,int length)

{

         int i=low;

         list dm;

         for(int i=low;i<length;i++)

         {

                   int k=i;

                   for(int j=i+1;j<length;j++)

                   {

                            if(D[k].key>D[j].key)

                                     k=j;

                   }

                   if(k!=i)

                   {

                            dm=D[k];

                            D[k]=D[i];

                            D[i]=dm;

                   }

         }

 

}

void main()

{

         int a[10]={1,11,2,3,41,54,42,40,8,4};

         list D[10];

         for(int i=0;i<10;i++)

                   D[i].key=a[i];

         Direct(D,0,10);

         for(int i=0;i<10;i++)

                   cout<<D[i].key<<endl;

      }

 

归并排序:

#include <iostream>

#include <stdio.h>

using namespace std;

typedef struct

{

         int key;

}list;

/**************************冒泡排序*********************************************/

void MA(list G[],int length)

{

         list md;

         for(int i=0;i<length;i++)

                   for(int j=0;j<length-i-1;j++)

                   {

                            if(G[j].key>G[j+1].key)

                            {

                                     md=G[j+1];

                                G[j+1]=G[j];

                                     G[j]=md;

                            }

                   }

        

}

/**************************归并排序*********************************************/

void  Gu(list G1[],int low1,int high1,int low2,int high2,list G2[],list G_K[])

{

         int i=low1,j=low2;

         int k=0;

         while((i<=high1)&&(j<=high2))

         {

                   if(G1[i].key<=G2[j].key)

                   {

                            G_K[k].key=G1[i].key;

                        i++;

                   }

                   else

                   {

                            G_K[k].key=G2[j].key;

                            j++;

                   }

                   k++;

         }

         while(i<=high1)

         {

                   G_K[k]=G1[i];

                   k++;

                   i++;

         }

         while(j<=high2)

         {

                   G_K[k]=G2[j];

                   k++;

                   j++;

         }

}

 

void main()

{

         list G[10],G1[10],G11[20];

         int a[10]={11,21,10,1,6,54,8,41,42,65};

         int b[10]={8,41,52,31,20,21,32,20,2,3};

         for(int i=0;i<10;i++)

         {

                   G[i].key=a[i];

             G1[i].key=b[i];

         }

         MA(G,10);

         MA(G1,10);

         Gu(G,0,9,0,9,G1,G11);

         for(int i=0;i<20;i++)

         cout<<G11[i].key<<endl;

       

}

 

 

快速排序法:

#include<stdio.h>

#include<stdlib.h>

#include <iostream>

using namespace std;

#define MATSIZE 10

typedef struct

{

         int key;

}list;

typedef struct

{

         list   list_data[MATSIZE];

         int  front;

         int  rear;

        

}fast_list;

int  Fa_data(list data[],int low ,int high)

{

         fast_list *aa;

   list  k=data[low];

         int rex[1];

while(low<high)

{

         while (((data[high].key>k.key) || (data[high].key==k.key)) &&(low<high))

                   high--;

         if(low<high)

         {

                   data[low]=data[high];

                   low++;

         }

         while (((data[low].key<k.key) || (data[low].key==k.key)) && (low<high))               

                   low++;

         if(low<high)

         {

         data[high]=data[low];

         high--;

         }

         //

         //

 

}

 

data[low]=k;

 

 

return low;

 

}

list * list_fast(list data[],int low,int high)

{

         if(low<high)

         {

                   int pos;

                   pos=Fa_data(data,low,high);

                   list_fast(data,low,pos-1);

                   list_fast(data,pos+1,high);

         }

         return data;

}

void main()

{

         fast_list  MM,* MM1;

         list Lm[10],*LM;

         MM.front=0;

         MM.rear=MATSIZE-1;

         int a[10]={3,5,2,1,4,6,22,77,2,10};

         for(int i=0;i<10;i++)

         Lm[i].key=a[i];

         LM=list_fast(Lm,0,9);

         //for(int i=0;i<2;i++)

         //MM1=Fa_data(MM1,0,3);

        

         //MM1=Fa_data(MM1,4,9);

         for(int i=0;i<10;i++)

                   printf("%d\n",LM[i].key);

        

}

 

堆排序:

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

typedef struct

{

         int key;

}list;

 

void Sift(list D[],int k,int m)

{

         list dm;

         dm=D[k];

         int i=k;

         int ddd=0;

         int j=2*i;

 while((j<=m))

  {

         if((j<m) &&(D[j].key<D[j+1].key))

                   j=j+1;

         if(dm.key>=D[j].key)

                   break;

         else

         {

                   D[i]=D[j];

                   i=j;

                   j=2*i;

         }

 

  }

 D[i]=dm;

}

void InitDu(list D[],int length)

{

        

         for(int k=length/2;k>=0;--k)

                   Sift(D,k-1,length-1);

        

 

}

list * HeapSort(list D[],int length)

{

         InitDu(D,length);

         list b;

         int n=length;

         for(int i=n-1;i>=1;--i)

         {

                   b=D[0];

                   D[0]=D[i];

                   D[i]=b;

                   //Sift(D,(i-1)/2,i-1);

                   InitDu(D,i);

         }

         return D;

}

void main()

{

         int a[10]={2,33,21,1,25,63,13,15,11,9};

         list D[10],*D1;

         for(int i=0;i<10;i++)

                   D[i].key =a[i];

         D1=HeapSort(D,10);

         for(int i=0;i<10;i++)

         printf("%d\n",D1[i].key);

     }

 

希尔排序:

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

typedef struct {

         int key;

}list;

void InitSh(list S[],int length,int d)

{

         //int d=length/2;

         list dm;

         for(int i=0;i<length-d;i++)

         {

                   if(S[i].key>S[i+d].key)

                   {

                            dm=S[i+d];

                            S[i+d]=S[i];

                            S[i]=dm;

                   }

         }

}

void Sh(list S[],int length)

{

 for(int d=length/2;d>=1;d--)

 {

          InitSh(S,length,d);

 }

}

void main()

{

         int a[10]={1,10,11,5,4,14,51,7,3,2};

         list D[10];

         for(int i=0;i<10;i++)

                   D[i].key=a[i];

         Sh(D,10);

         for(int i=0;i<10;i++)

                   cout<<D[i].key<<endl;

     }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值