算法概念-Start

本文详细介绍了两种常见的排序算法:插入排序和合并排序,并提供了详细的C语言实现代码。文章通过实例演示了如何使用这两种算法来对一组数据进行排序,同时讨论了算法的循环不变式及其在确保算法正确性方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题如下:
输入:n个数<a[1], a[2], ... , a[n]>
输出:输入序列的一个排列(即重新排序)<a[1], a[2], ... , a[n]>,使得a[1] <= a[2] <= ... <= a[n]

1.插入排序

#include <stdio.h>
/*
 *插入排序
 *输入:    a:待排序数组
 *       n:n个数<a[0], a[1], ... , a[n-1]>
 *输出:    输入序列的一个排列(即重新排序)<a[0], a[1], ... , a[n-1]>,使得a[0]<=a[1]<=...<=a[n-1]
 
*/

void InsertSort(int *a, int n)
{
    
int i, j;
    
int x;
    
for(j=1; j<n; j++)
    
{
        x 
= a[j];
        i 
= j - 1;
        
while((i >= 0&& (a[i] > x))
        
{
            a[i
+1= a[i];
            i
--;
        }

        a[i
+1= x;
    }

}


int main()
{
    
int i, n;
    
int A[10];
    n 
= 10;
    
for(i=0; i<n; i++)
    
{
        scanf(
"%d"&A[i]);
    }

    InsertSort(A, n);
    
for(i=0; i<n; i++)
        printf(
"%3d", A[i]);
    printf(
" ");

    
return 0;
}


循环不变式主要用来理解算法的正确性。对于循环不变式,必须证明它的三个性质:
初始化:它在循环的第一轮迭代开始之前,应该是正确的。
保持:如果在循环的某一次迭代开始之前它是正确的,那么,在下一次迭代开始之前,它也应该保持正确。
终止:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。
执行算法InsertSort的元素比较次数在n - 1到n(n - 1) / 2之间。元素赋值次数等于元素比较次数加上n - 1。

 2.合并排序

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

void PrintResult(int *a, int length)
{
    
int i;
    
for(i = 0; i < length; i++)
    printf(
"%d ",a[i]);
    printf(
" ");
}


void Merge(int *a, int p, int q, int r)
{
    
int i, j, k;
    
int n1, n2;
    
int *L;
    
int *R;

    n1 
= q - p + 1;
    n2 
= r - q;
    L 
= (int *)malloc((n1 + 1* sizeof(int));
    R 
= (int *)malloc((n2 + 1* sizeof(int));

    
for(i = 0; i < n1; i++)
        L[i] 
= a[p+i];
    
for(j = 0; j < n2; j++)
        R[j] 
= a[q+1+j];
    L[n1] 
= INT_MAX;
    R[n2] 
= INT_MAX;
    i 
= 0;
    j 
= 0;
    
for(k = p; k <= r; k++)
    
{
        
if(L[i] <= R[j])
        
{
            a[k] 
= L[i];
            i
++;
        }

        
else
        
{
            a[k] 
= R[j];
            j
++;
        }

    }


    free(L);
    free(R);
}


void MergeSort(int *a, int p, int r)
{
    
int q;
    
if(p < r)
    
{
        q 
= (p + r) / 2;
        MergeSort(a, p, q);
        MergeSort(a, q
+1, r);
        Merge(a, p, q, r);
    }

}


int main(int argc, char **argv)
{
    
int i;
    
int a[9]={5,8,6,7,9,3,4,2,1};
    MergeSort(a,
0,8);
    PrintResult(a,
9);
    
return 0;    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值