数据结构实验六:内部排序技术

复制代码
内部排序——快速排序

#include<stdio.h>
#include<stdlib.h>
void myqsort(int *a,int low,int high)
{
    int i,j; 
    int c; 
    c=a[low]; 
    i=low; 
    j=high; 
    while(i<j) 
    { 
        while(a[j]>=c && i<j)--j; 
            a[i]=a[j]; 
        while(a[i]<=c && i<j)++i; 
            a[j]=a[i]; 
    } 
    a[i]=c; 
    if(i-1>low) myqsort(a,low,i-1); 
    if(high>i+1) myqsort(a,i+1,high);
}
int main()
{
    int a[30],i;
    for(i=0;i<20;i++)
        a[i]=rand()%50;
    for(i=0;i<20;i++)
    printf("%d ",a[i]);
    printf("\n");
    myqsort(a,0,20);
    for(i=0;i<20;i++)
    printf("%d ",a[i]);
    printf("\n");        
}


内部排序——堆排序
#include <stdio.h>
#include <math.h>
#define LEFT(i) ((i)<<1)
#define RIGHT(i) (((i)<<1)+1)
void max_heapify(int a[], int i, int heapsize);
void heap_sort(int a[], int heapsize);
void build_max_heap(int a[], int heapsize);
void exchange(int *x, int *y);
//交换两个数的值
void exchange(int *x, int *y) 
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
//保持最大堆性质
void max_heapify(int a[], int i, int heapsize) 
{    
    int left, right, largerest;
    left = LEFT(i);
    right = RIGHT(i);
    if (left <= heapsize && a[left] > a[i])
    {
        largerest = left;
    }
    else
    {        
        largerest = i;
    }
    if (right <= heapsize && a[right] > a[largerest])
    {
        largerest = right;
    }
    if(largerest != i) 
    {        
        exchange(&a[i], &a[largerest]);
        max_heapify(a, largerest, heapsize);
    }
}
//建造最大堆
void build_max_heap(int a[], int heapsize) 
{    
    int i;
    for (i = (int) ceil(heapsize/2); i >= 1 ; i--)
    {
        max_heapify(a, i, heapsize);
    }
}
//堆排序
void heap_sort(int a[], int heapsize) 
{    
    int i;
    //build heap
    build_max_heap(a, heapsize);
    while(heapsize > 1)
    {
        //exchange max
        exchange(&a[1], &a[heapsize]);
        heapsize--;
        max_heapify(a, 1, heapsize);
    }
}
int main() 
{    
    int a[] = 
    {
        020233819,
        98203803378,
        346849955};
    int array_size = sizeof(a) /sizeof(int);
    int i, heapsize;
    heapsize = array_size - 1;
    heap_sort(a, heapsize);
    //打印排序后的数组
    for (i = 1; i <= heapsize ; i++)
    {
        printf("%d\t", a[i]);
    }
    printf("\n");
    getchar();
    return 0;
}
复制代码

posted on   ma6174  阅读(587)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

统计

点击右上角即可分享
微信分享提示