c语言实现 堆排序和插入排序


1.堆排序

#include<stdio.h>
#include<stdlib.h>
/* p是循环输出的下表*/
int p=0;
/*堆调整算法*/
/* r[]数组 , 根结点的编号为k,最后一个结点的编号为m  */
void Sift(int r[ ], int k, int m)        
{
       int i, j, temp;
       p++;i = k; j =2 * i;                  /* p是循环输出的下表   i是被筛选结点,j是结点i的左孩子*/
       while (j <= m)                 /*筛选还没有进行到叶子*/
            {
            if (j < m-1 && r[j] < r[j+1]) j++;  /*比较i的左右孩子,j指向较大者*/
          if (r[i] > r[j]) break;           /*根结点大于左右孩子中的较大者*/
               else {
                         temp = r[i]; r[i] = r[j]; r[j] = temp;     /*将根结点与结点j交换*/
                                    i = j; j = 2 * i;              /*被筛结点位于原来结点j的位置*/
          }
              }
         /*输出每一次 调整的代码*/
        printf("NO.%d line:\t", p);
        for(i = 1; i< 7 ;i++)
    {
    printf("%3d",r[i]);
                }
        printf("\n----------------------------------\n");
}
/*堆排序算法*/
void HeapSort(int r[ ], int n)     /* r[0]为交换的临时单元*/
{
        int i;
        /*初始建堆,从最后一个分支结点至根结点*/
        for (i = n/2; i >= 1; i--)      
        Sift(r, i, n) ;     
        for (i = 1; i < n; i++)         
        {
             r[0] = r[1]; r[1] = r[n-i+1]; r[n-i+1] = r[0];   /*交换r[1]和r[n-i+1]*/
             Sift(r, 1, n-i);                          /*对r[1]~r[n-i]重建堆*/
         }
}
/*主函数*/
int main()
{
    int i=0;
    int r[]={0,55,90,17,87,30,66}; 
    /* 排序前的数 */
    printf("Heap  sort before:");
    for(i = 1; i< 7; i++)
    printf("%3d", r[i]);
    /* 输出排序后的数 */
    printf("\n heap sort after:\n");
    HeapSort(r, 6);
    
    system("color 4E");
    system("pause");
    return 0;
}

2.插入排序

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 void InsertSort(int r[ ], int n)          /*r[0]用作暂存单元和监视哨*/
 5 {    
 6   int i, j;
 7 for (i = 2; i <= n; i++)
 8 { 
 9 r[0] = r[i];                     /*暂存待插记录,设置哨兵*/
10 for (j = i - 1; r[0] < r[j]; j--)       /*寻找插入位置*/
11 r[j + 1] = r[j];                
12     r[j + 1] = r[0];    
13 }
14 }
15 int main()
16 {
17     int i;
18     int r[]={0,12,15,9,20,6,31,24}; 
19     printf("排序之前的元素是");
20     for(i = 1; i< 8; i++)
21     printf("%3d", r[i]);
22     printf("\n排序后的元素是:");
23     InsertSort(r, 7);
24     for(i = 1; i< 8 ;i++)
25     printf("%3d", r[i]);
26     return 0;
27 }
posted @ 2019-03-28 13:30  Tony小哥  阅读(353)  评论(0编辑  收藏  举报