关于插入、合并、快速排序的源码

本文详细介绍了插入排序、合并排序及快速排序三种经典排序算法的实现原理与代码实现,并通过一个具体的示例展示了如何使用这些算法对数组进行排序。

下面3个排序函数都是对数组进行排序, 排序后为非递减序列
函数模版,  两个参数, 一个是数组首地址, 另一个是元素个数, 如 merge_sort( A, 20);

/*******************************Insertion sort ****************************************/
template  < class  T >
void  insertion_sort(T entry[],  int  count)
{
   int first_unsorted;    //  position of first unsorted entry
   int position;          //  searches sorted part of list
   T current;        //  holds the entry temporarily removed from list

   for (first_unsorted = 1; first_unsorted < count; first_unsorted++)
      if (entry[first_unsorted] < entry[first_unsorted - 1]) {
         position = first_unsorted;
         current = entry[first_unsorted];         //  Pull unsorted entry out of the list.
         do {               //  Shift all entries until the proper position is found.
            entry[position] = entry[position - 1];
            position--;                           //  position is empty.
         }
 while (position > 0 && entry[position - 1] > current);
         entry[position] = current;
      }

}

/*******************************Insertion ^^^^ sort ****************************************/


合并排序:

/******************************Merge sort***************************************/
template < typename T >
void  merge(T arr[],  int  low,  int  mid,  int  high)
/* merge arr[low..mid] and arr[mid+1..high]; */
{
    int i, j, k;
    int len1=mid-low+1;
    int len2=high-mid;
    T *left=new T[len1];
    T *right=new T[len2];
    for(i=0; i<len1; i++)
        left[i]=arr[low+i];
    for(i=0; i<len2; i++)
        right[i]=arr[mid+1+i];
    for(i=0, j=0, k=low; i<len1 && j<len2 ; k++)
        if(left[i]<=right[j])
            arr[k]=left[i++];
        else
            arr[k]=right[j++];
    if(i>=len1)
        while( j<len2)
            arr[k++]=right[j++];
    else 
        while( i<len1)
            arr[k++]=left[i++];
      delete[] left;               // remember to delete 
      delete[] right;
    return;
}


template < typename T >
void  recursive_merge_sort(T arr[],  int  low,  int  high)
{
    if(low<high)
    {
        int    mid=(low+high)/2;
        recursive_merge_sort(arr, low, mid);
        recursive_merge_sort(arr, mid+1, high);
        merge(arr, low, mid, high);
    }

}


template < typename T >
void  merge_sort(T arr[],  int  num)
{
    recursive_merge_sort(arr, 0, num-1);
}


/******************Merge ^^^^^ sort****************************************************/



快速排序:


/******************************************Quick sort *******************************/
template  < class  T >
int  partition(T entry[],  int  low,  int  high)
{
   T pivot;
   int i,            //  used to scan through the list
       last_small;   //  position of the last key less than pivot
   swap(entry[low], entry[(low + high) / 2]);
   pivot = entry[low];   //  First entry is now pivot.
   last_small = low;
   for (i = low + 1; i <= high; i++)
      if (entry[i] < pivot) {
         last_small = last_small + 1;
         swap(entry[last_small], entry[i]);  //  Move large entry to right and small to left.
      }

   swap(entry[low], entry[last_small]);      //  Put the pivot into its proper position.
   return last_small;
}


template  < class  T >
void  recursive_quick_sort(T entry[],  int  low,  int  high)
{
   int pivot_position;
   if (low < high) {   //   Otherwise, no sorting is needed.
      pivot_position = partition(entry, low, high);
      recursive_quick_sort(entry, low, pivot_position - 1);
      recursive_quick_sort(entry, pivot_position + 1, high);
   }

}


template  < class  T >
void  quick_sort(T entry[],  int  count)
{
   recursive_quick_sort(entry, 0, count - 1);
}


例子:

#include<iostream>
#include<cstdlib>
#include<ctime>
using   namespace  std;

int  main()
{
    srand((unsigned)time( NULL ) ); //Seed the random-number generator with current time         
    int i, n=20;
    int arr[30];
    cout<<"before sorting: ";
    for(i=0; i<n; i++)
    {
        arr[i]=rand()%100;               // rand() 返回0-RAND_MAX (32767)的伪随机数
        cout<<arr[i]<<endl;
    }

    //quick_sort(arr, n):       // 调用quick_sort 
    //insertion_sort(arr, n);    // 调用insertion_sort
    merge_sort(arr, n);
    cout<<"after sorting: ";
    for(i=0; i<n; i++)
        cout<<arr[i]<<endl;
    return 0;
}

 

课程设计报告:总体方案设计说明 一、软件开发环境配置 本系统采用C++作为核心编程语言,结合Qt 5.12.7框架进行图形用户界面开发。数据库管理系统选用MySQL,用于存储用户数据与小精灵信息。集成开发环境为Qt Creator,操作系统平台为Windows 10。 二、窗口界面架构设计 系统界面由多个功能模块构成,各模块职责明确,具体如下: 1. 起始界面模块(Widget) 作为应用程序的入口界面,提供初始导航功能。 2. 身份验证模块(Login) 负责处理用户登录与账户注册流程,实现身份认证机制。 3. 游戏主大厅模块(Lobby) 作为用户登录后的核心交互区域,集成各项功能入口。 4. 资源管理模块(BagWidget) 展示用户持有的全部小精灵资产,提供可视化资源管理界面。 5. 精灵详情模块(SpiritInfo) 呈现选定小精灵的完整属性数据与状态信息。 6. 用户名录模块(UserList) 系统内所有注册用户的基本信息列表展示界面。 7. 个人资料模块(UserInfo) 显示当前用户的详细账户资料与历史数据统计。 8. 服务器精灵选择模块(Choose) 对战准备阶段,从服务器可用精灵池中选取参战单位的专用界面。 9. 玩家精灵选择模块(Choose2) 对战准备阶段,从玩家自有精灵库中筛选参战单位的操作界面。 10. 对战演算模块(FightWidget) 实时模拟精灵对战过程,动态呈现战斗动画与状态变化。 11. 对战结算模块(ResultWidget) 对战结束后,系统生成并展示战斗结果报告与数据统计。 各模块通过统一的事件驱动机制实现数据通信与状态同步,确保系统功能的连贯性与数据一致性。界面布局遵循模块化设计原则,采用响应式视觉方案适配不同显示环境。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值