几种排序算法的实现

//
/*利用随机函数产生N个随机整数(2000以上),对这些数进行多种方法进行排序。

要求:

至少采用三种方法实现(提示,可采用插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。
并把排序后的结果保存在不同的文件中。

统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。
*/


// distracb:
//    几种排序方法的实现


#include
< stdio.h >
#include
< time.h >
#include
< stdlib.h >

#define  MAXSIZE  100
//  const int MAXSIZE = 20 ;

// 定义数据结构

typedef 
int  KeyType;
typedef  
char  InfoType;

typedef  
struct {
    KeyType key;
    InfoType otherinfo;
}
RcdType;   // 记录类型

typedef 
struct {
    RcdType r[MAXSIZE
+1];
    
int length;
}
SqList;

typedef SqList HeapType;  
// 堆采用顺序表存储结构表示

// 函数声明部分
// (注意声明部分要加返回类型)
bool  LT(KeyType a ,KeyType b);    // 比较两个关键字大小的函数
void  InsertSort(SqList L);    // 直接插入排序
void  BInsertSort(SqList L);   // 折半插入排序
void  BubbleSort(SqList L);   // 冒泡排序
void  QuickSort(SqList L);    // 快速排序
void  ShellSort(SqList L);    // 希尔排序

//
bool  LT(KeyType  a ,KeyType  b)
{
    
if(a <= b) return true;
    
else return false;
}

/*
//直接插入排序
void InsertSort(SqList L)
{
    for(int i=2;i<=L.length;i++)
    if(LT(L.r[i].key,L.r[i-1].key))
    {
        L.r[0]=L.r[i];       //复制为哨兵
        L.r[i]=L.r[i-1];
        for(int j=i-2;LT(L.r[0].key,L.r[j].key);j--)
        L.r[j+1]=L.r[j];       //记录后移
        L.r[j+1]=L.r[0];     //插入到正确位置
    }
    printf("after insertsort the recodelist is : ");
    for(i=1;i<=L.length;i++)
    printf("%d ",L.r[i].key);
}


//折半插入排序
void BInsertSort(SqList L)
{
    for(int i=2;i<=L.length;i++)
    {
        L.r[0]=L.r[i];
        L.r[i]=L.r[i-1];
        int low=0,high=i-1;
        while(low<high) //寻找插入位置
        {
            int m=(low+high)/2;
            if(LT(L.r[0].key,L.r[m].key))
            high=m-1;
            else low=m+1;
        }
        for(int j=i-1;j>=high+1;j--)
        L.r[j+1]=L.r[j];       //记录后移
        L.r[high+1]=L.r[0];       //插入记录
    }
    printf("after Binary insertsort the recodelist is : ");
    for(i=1;i<=L.length;i++)
    printf("%d  ",L.r[i].key);
}


//希尔排序
void ShellInsert(SqList L ,int dk )  //一趟希尔插入排序
{
    for(int i=dk+1;i<=L.length;i++)
        if(LT(L.r[i].key,L.r[i-dk].key))
        {
            L.r[0]=L.r[i];
            for(int j=i-dk;(j>0) && LT(L.r[0].key,L.r[j].key);j-=dk)
            L.r[j+dk]=L.r[j];
            L.r[j+dk]=L.r[0];
        }
}

int dlta[]={8,4,2,1};  //增量序列dlta[k]=2^(t-k-1)  t为排序趟数4
int t=4;
void ShellSort(SqList L ,int dlta[],int t )
{
    for(int k=0;k<t;k++)
    ShellInsert( L ,dlta[k] );
    
    printf("after ShellSort the recodelist is : ");
    for(int i=1;i<=L.length;i++)
    printf("%d ",L.r[i].key);
}


//冒泡排序
void BubbleSort(SqList L)
{
    int flag=1;
    for(int i=1;i<=L.length && flag!=0;i++)
    {
        flag=0;
        for(int j=1;j<=(L.length-i);j++)
            if(LT(L.r[j].key,L.r[j+1].key))
            {
                RcdType temp = L.r[j];
                L.r[j] = L.r[j+1];
                L.r[j+1] = temp;
                flag=1;
            }
    }
    printf("after BubbleSort the recodelist is : ");
    for(i=1;i<=L.length;i++)
    printf("%d ",L.r[i].key);
}


//快速排序
int Partition(SqList L,int low ,int high)  //一次划分
{
    L.r[0] = L.r[low];
    KeyType pivotkey = L.r[low].key;  //第一个记录作为枢轴记录
    while(low<high)
    {
        while((low < high) && LT(pivotkey,L.r[high].key))
          --high;
          L.r[low] = L.r[high];
        while(low<high && LT(L.r[low].key , pivotkey )) 
            ++low;
            L.r[high] = L.r[low];
    }
    L.r[low]=L.r[0];       //枢轴记录到位
    return low;           //返回枢轴位置
}

void Qsort(SqList L,int low,int high)
{
    if(low<high)
    {
        int pivotkey = Partition(L,low,high);
        Qsort(L,pivotkey+1 ,high);
        Qsort(L,low,pivotkey-1);
    }

}

void QuickSort(SqList L)
{
    Qsort( L, 1, L.length);
    printf("after QuickSort the recodelist is : ");
    for(int i=1;i<=L.length;i++)
    printf("%d ",L.r[i].key);
}


//简单选择排序
SelectMinKey(SqList,int); //声明

void SelectSort(SqList L)
{    
    for(int i=1;i<L.length;i++)
    {
        int j = SelectMinKey(L,i); //在L.r[i....L.length]中选择一个最小的记录
        if(i!=j)   //交换记录
        {
            RcdType temp = L.r[j];
            L.r[j] = L.r[i];
            L.r[i] = temp;
        }
    }
    printf("after SelectSort the recodelist is : ");
    for(i=1;i<=L.length;i++)
    printf("%d ",L.r[i].key);
}

int SelectMinKey(SqList L,int i)  //寻找记录中最小值的位置
{
    KeyType k;
    int position;
    k = L.r[i].key;
    for(;i<=L.length;i++)
    {
        if(LT(L.r[i].key,k))
        {
            k = L.r[i].key;
            position=i;
        }
    }
    return position;
}

//堆排序


void HeapAdjust(HeapType H, int s ,int m)   //堆调整函数(筛选)
//已知H.r[s...m]中记录的关键字除H.r[s].key 之外均满足堆的定义,本函数调整H.r[s]的关键字
//使H.r[s....m]成为一个大顶堆(对其中的关键字而言)
{
    RcdType rc = H.r[s];  //现在的顶部结点
    for(int j=2*s;j<=m;j*=2)        //沿key 较大的孩子结点像下筛选
    {
        if(j<m && LT(H.r[j].key,H.r[j+1].key)) ++j;  //j为较大记录的下标
        if(!LT(rc.key,H.r[j].key))  break;  //rc应插入在位置s上
        H.r[s]=H.r[j];
        s=j;
    }
    H.r[s]=rc;   //插入
}

void HeapSort(HeapType H)   //堆排序
{
    for(int i=H.length/2; i>0;i--)  //把H.r[1...L.length]建成大顶堆
    HeapAdjust( H, 1 ,H.length);
    for(i=H.length;i>1;i--)
    {
        RcdType temp = H.r[1];      //将堆顶记录和子序列H.r[1...i]中的最后一个记录交换
        H.r[1]=H.r[i];
        H.r[i]=temp;
        HeapAdjust(H, 1 ,i-1);  //重新调整为大顶堆
    }
    printf("after HeapSort the recodelist is : ");
    for(i=1;i<=H.length;i++)
    printf("%d ",H.r[i].key);
}

*/

// 2-路归并排序
void  Merge(RcdType SR[],RcdType TR[], int  i, int  m, int  n)   /????RcdType &TR[]为什么就提示好多错误??
// 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
{
    
for(int k=i,j=m+1;(i<=m) && (j<=n);++k)  //将SR中的记录由小到大的并入到TR
    {
        
if(LT(SR[i].key,SR[j].key))
        TR[k]
= SR[i++];
        
else TR[k]=SR[j++];
    }

    
if(i<=m)
    

        
for(;i<=m;i++,k++)
        TR[k]
=SR[i];
    }

    
if(j<=n)
    
{
        
for(;j<=n;j++,k++)
        TR[k]
=SR[j];
    }

}


void  MSort(RcdType SR[],RcdType TR1[], int  s, int  t)
// 将SR[s..t]归并排序为TR1[s..t]
{
    RcdType TR2[
20]; ///????????????????????这里应该定义数组多大呢 、?
    if(s == t) TR1[s]=SR[s];
    
else{
        
int m=(s+t)/2;  //将SR平分成两部分
        MSort(SR,TR2,s,m);  //递归地将SR[s..m]归并为有序的TR2[s.m]
        MSort(SR,TR2,m+1,t); //递归地将SR[m+1..t]归并为有序的TR2[m+1..t]
        Merge(TR2,TR1,s,m,t); //将TR2[s.m]  TR2[m+1..t]归并到 TR1[s..m]
    }

}


void  MerqeSort(SqList L)
{
    MSort(L.r,L.r,
1,L.length);
    printf(
"after MerqeSort the recodelist is : ");
    
for(int i=1;i<=L.length;i++)
    printf(
"%d ",L.r[i].key);
}


void  menu()
{
    printf(
" *************************** ");
    printf(
" 1: Insert Sort ");
    printf(
" 2: BInsert Sort ");
    printf(
" 3: Bubble Sort ");
    printf(
" 4: Quick Sort ");
    printf(
" 5: Straight Selection Sort ");
    printf(
" 6: Heap Sort ");
    printf(
" 7: Merge Sort ");
    printf(
" 8: Exit ");
    printf(
" *************************** ");
}


// 主函数
void  main()
{
    SqList L;
    srand(
10);
    
for(int i=1;i<=MAXSIZE;i++)
    L.r[i].key
=rand()+2000;
    L.length
=MAXSIZE;
    
        menu();
        clock_t start, finish; 
double duration; 
/*        double duration[8]; 
        int count=0;
        
             start = clock();  
             InsertSort( L);
             finish = clock();  
             duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
             printf( "InsertSort cost time %f seconds: ", duration[count] ); 
             count++;
             system("pause"); 
        
             start = clock();    
             BInsertSort( L);
             finish = clock();  
             duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
             printf( "BInsertSort cost time %f seconds: ", duration[count] ); 
             count++;
             system("pause"); 
                 
             start = clock();
             ShellSort( L ,dlta,4 );
             finish = clock();  
             duration[count]= (double)(finish - start) / CLOCKS_PER_SEC; 
             printf( "ShellInsert cost time %f seconds: ", duration[count] ); 
             count++;
             system("pause"); 
         
             start = clock();
             BubbleSort( L);
             finish = clock();  
             duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
             printf( "BubbleSort cost time %f seconds: ", duration[count]  ); 
             count++;
             system("pause"); 
                 
             start = clock();
             QuickSort( L);
             finish = clock();  
             duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
             printf( "QuickSort cost time %f seconds: ", duration[count]  ); 
             count++;
             system("pause"); 
         
             start = clock();
             SelectSort(L);
             finish = clock();  
             duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
             printf( "SelectSort cost time %f seconds: ", duration[count] ); 
             count++;
             system("pause"); 
                 
             start = clock();
             HeapSort( L);
             finish = clock();  
             duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
             printf( "HeapSort cost time %f seconds: ", duration[count] ); 
             count++;
             system("pause"); 
*/
             
             start 
= clock();
             MerqeSort( L);
             finish 
= clock();  
        
//     duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
        
//     printf( "MerqeSort cost time %f seconds: ", duration[count] ); 
             
//count++;
             duration = (double)(finish - start) / CLOCKS_PER_SEC; 
             printf( 
"MerqeSort cost time %f seconds: ", duration ); 
             system(
"pause"); 
         
/*         printf("compare the cost time here : ");
         for(count=0;count<8;count++)
         {
               printf( "T%d cost time %f seconds: ", count+1,duration[count] );
         }
*/
         
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值