简单算法复习

第一、插入排序

void InsertSort( int *a, int len )
{
    int i, j, key ;

    for( i=1; i<len; i++ )
    {

        key = a[i] ;
        for( j=i-1; j>=0&&a[j]>key; j-- )
            a[j+1] = a[j] ;

        a[j+1] = key ;
    }
}

 

第二、冒泡排序

void bubSort( int *a, int len )
{
    int i, j, temp ;
    for( i=len; i>0; i-- )
    {
        for( j=1; j<i; j++ )

        {
            if( *(a+j)<*(a+j-1) )
            {
                temp = *(a+j) ;
                *(a+j) = *(a+j-1) ;
                *(a+j-1) = temp ;
            }

        }
    }

}

 

第三、shell排序

void shell( int *a, int len )
{
    int i, j, temp, step ;
    for( step=len/2; step>0; step/=2 )
    {
        for( i=step; i<len; i++ )
        {
            temp = *( a+i ) ;
            for( j=i-step; j>=0&&temp<*(a+j); j-=step )
            {
                *(a+j+step) = *(a+j) ;

            }
            *(a+j+step) = temp ;
        }
    }

}

 

第四、快速排序(1)

int divide( int a[], int low, int high )
{
 int k = a[low] ;
 do
 {
  while ( low<high && a[high]>=k )
   --high ;
  if ( low<high )
  {
   a[low] = a[high] ;
   ++low ;
  }
  while ( low<high && a[low]<=k )
   ++low ;
  if ( low<high )
   a[high] = a[low] ;
 } while ( low!=high ) ;
 a[low] = k ;
 return low ;
}

void quiSort( int a[], int low, int high )
{
 int mid ;
 if( low>=high ) return ;
 mid = divide( a, low, high ) ;
 quiSort( a, low, mid-1 ) ;
 quiSort( a, mid+1, high ) ;
}

 

第五、快速排序(2)

其实只是分区方式不同而已,所以只列出分区函数。

int partition( int a[], int low, int high )
{
 int key = a[high] ;
 int i = low - 1 ;
 int temp, j ;
 for( j=low; j<=high-1; j++ )
 {
  if( a[j] <=key )
  {
   i = i+1 ;
   temp = a[i] ;
   a[i] = a[j] ;
   a[j] = temp ;
  }
 }
 temp = a[i+1] ;
 a[i+1] = a[high] ;
 a[high] = temp ;
 return (i+1) ;
}

 

第六、归并排序

void Merge_TwoArr( int *a, int *temp, int start, int mid, int end )
{
 int i, j, k ;
 k = start ;
 i = start ;
 j = mid + 1 ;

 while( i<=mid && j<=end )
 {
  if( a[i]<=a[j] )
   temp[k++] = a[i++] ;
  else
   temp[k++] = a[j++] ;
 }
 while( i<=mid )
  temp[k++] = a[i++] ;
 while( j<=end )
                temp[k++] = a[j++] ;

 for( i=start; i<=end; i++ )
  a[i] = temp[i] ;
}

void MergeSort( int *a,  int *temp, int start, int end )
{
 if( start<end )
 {
  int mid = ( start+end )/2 ;
  MergeSort( a, temp, start, mid ) ;
  MergeSort( a, temp, mid+1, end ) ;
  Merge_TwoArr( a, temp, start, mid, end ) ;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最优化算法是一种寻找最佳解决方案的方法。它是通过优化目标函数来实现的,目标函数可以是最大化或最小化。最优化算法广泛应用于各个领域,如工程、经济学、物理学等。 在期末考试中,我参考了CSDN上的相关内容,对最优化算法进行了深入学习和复习。我了解到最优化算法可以分为离散优化和连续优化两大类。 离散优化主要解决的问题是在有限的可能解集合中,寻找一个最优解。常见的离散优化算法包括贪心算法、分支定界算法和遗传算法等。贪心算法是一种每一步都选择当前最优解的方法,这种算法简单且高效。分支定界算法通过将复杂问题划分为多个小问题,逐步缩小搜索空间,最终得到最优解。遗传算法则是通过模拟自然界的进化过程,逐代地生成优秀解,在优化搜索中有着很好的效果。 连续优化则是解决在连续的解空间中寻找最优解的问题。常见的连续优化算法有梯度下降法、牛顿法和模拟退火算法等。梯度下降法通过计算目标函数对变量的梯度,不断更新变量的取值,直到达到局部最优解。牛顿法则是利用二阶导数来进行优化,对于复杂函数有着较好的效果。模拟退火算法则是通过随机搜索的方式,通过接受一定程度的劣解,以增加搜索的多样性,最终达到全局最优解。 通过对最优化算法的学习和复习,我对这一知识点有了全面的了解。期末考试中,我可以灵活运用各种最优化算法,解决不同类型的优化问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值