各种排序

功能:选择排序       输入:数组名称(也就是数组首地址)、数组中元素个数         */     void   select_sort(int   *x,   int   n)     {       int   i,   j,   min,   t;           for   (i=0;   i<n-1;   i++)   /*要选择的次数:0~n-2共n-1次*/       {         min   =   i;   /*假设当前下标为i的数最小,比较后再调整*/         for   (j=i+1;   j<n;   j++)/*循环找出最小的数的下标是哪个*/         {           if   (*(x+j)   <   *(x+min))           {                   min   =   j;   /*如果后面的数比前面的小,则记下它的下标*/           }         }                     if   (min   !=   i)   /*如果min在循环中改变了,就需要交换数据*/         {           t   =   *(x+i);           *(x+i)   =   *(x+min);           *(x+min)   =   t;         }       }     }             /*     ================================================       功能:直接插入排序       输入:数组名称(也就是数组首地址)、数组中元素个数     ================================================     */     void   insert_sort(int   *x,   int   n)     {       int   i,   j,   t;           for   (i=1;   i<n;   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的数的放置位置*/       }     }             /*     ================================================       功能:冒泡排序       输入:数组名称(也就是数组首地址)、数组中元素个数     ================================================             void   bubble_sort(int   *x,   int   n)     {       int   j,   k,   h,   t;               for   (h=n-1;   h>0;   h=k)   /*循环到没有比较范围*/       {         for   (j=0,   k=0;   j<h;   j++)   /*每次预置k=0,循环扫描后更新k*/         {           if   (*(x+j)   >   *(x+j+1))   /*大的放在后面,小的放到前面*/           {             t   =   *(x+j);             *(x+j)   =   *(x+j+1);             *(x+j+1)   =   t;   /*完成交换*/             k   =   j;   /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/           }         }       }     }                       /*     ================================================       功能:希尔排序       输入:数组名称(也就是数组首地址)、数组中元素个数     ================================================     */     /*         */     void   shell_sort(int   *x,   int   n)     {       int   h,   j,   k,   t;           for   (h=n/2;   h>0;   h=h/2)   /* 控制 增量*/       {         for   (j=h;   j<n;   j++)   /*这个实际上就是上面的直接插入排序*/         {           t   =   *(x+j);           for   (k=j-h;   (k>=0   &&   t<*(x+k));   k-=h)           {             *(x+k+h)   =   *(x+k);           }           *(x+k+h)   =   t;         }       }     }             /*     ================================================       功能:快速排序       输入:数组名称(也就是数组首地址)、数组中起止元素的下标     ================================================     */     /*     ====================================================     void   quick_sort(int   *x,   int   low,   int   high)     {       int   i,   j,   t;           if   (low   <   high)   /*要排序的元素起止下标,保证小的放在左边,大的放在右边。这里以下标为low的元素为基准点*/       {         i   =   low;         j   =   high;         t   =   *(x+low);   /*暂存基准点的数*/             while   (i<j)   /*循环扫描*/         {           while   (i<j   &&   *(x+j)>t)   /*在右边的只要比基准点大仍放在右边*/           {             j--;   /*前移一个位置*/           }               if   (i<j)             {             *(x+i)   =   *(x+j);   /*上面的循环退出:即出现比基准点小的数,替换基准点的数*/             i++;   /*后移一个位置,并以此为基准点*/           }               while   (i<j   &&   *(x+i)<=t)   /*在左边的只要小于等于基准点仍放在左边*/           {             i++;   /*后移一个位置*/           }               if   (i<j)           {             *(x+j)   =   *(x+i);   /*上面的循环退出:即出现比基准点大的数,放到右边*/             j--;   /*前移一个位置*/           }         }             *(x+i)   =   t;   /*一遍扫描完后,放到适当位置*/         quick_sort(x,low,i-1);     /*对基准点左边的数再执行快速排序*/         quick_sort(x,i+1,high);     /*对基准点右边的数再执行快速排序*/       }     }             /*     ================================================       功能:堆排序       输入:数组名称(也就是数组首地址)、数组中元素个数     ================================================     */     /*     ====================================================       */     /*       功能:渗透建堆       输入:数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始     */     void   sift(int   *x,   int   n,   int   s)     {       int   t,   k,   j;           t   =   *(x+s);   /*暂存开始元素*/       k   =   s;     /*开始元素下标*/       j   =   2*k   +   1;   /*右子树元素下标*/           while   (j<n)       {         if   (j<n-1   &&   *(x+j)   <   *(x+j+1))/*判断是否满足堆的条件:满足就继续下一轮比较,否则调整。*/         {           j++;         }             if   (t<*(x+j))   /*调整*/         {           *(x+k)   =   *(x+j);           k   =   j;   /*调整后,开始元素也随之调整*/           j   =   2*k   +   1;         }         else   /*没有需要调整了,已经是个堆了,退出循环。*/         {           break;         }       }             *(x+k)   =   t;   /*开始元素放到它正确位置*/     }             /*       功能:堆排序       输入:数组名称(也就是数组首地址)、数组中元素个数     */     void   heap_sort(int   *x,   int   n)     {       int   i,   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);   /*剩下的数再建堆*/         }     }             void   main()     {         #define   MAX   4       int   *p,   i,   a[MAX];             /*录入测试数据*/       p   =   a;       printf("Input   %d   number   for   sorting   :/n",MAX);       for   (i=0;   i<MAX;   i++)       {         scanf("%d",p++);       }       printf("/n");           /*测试选择排序*/                 p   =   a;       select_sort(p,MAX);       /**/               /*测试直接插入排序*/           /*       p   =   a;       insert_sort(p,MAX);       */                 /*测试冒泡排序*/           /*       p   =   a;       insert_sort(p,MAX);       */           /*测试快速排序*/           /*       p   =   a;       quick_sort(p,0,MAX-1);       */           /*测试堆排序*/           /*       p   =   a;       heap_sort(p,MAX);       */           for   (p=a,   i=0;   i<MAX;   i++)       {         printf("%d   ",*p++);       }             printf("/n");       system("pause");     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值