冒泡-选择-插入排序算法的实现

排序算法

排序是编程中很重要的一种算法,虽然各编程语言都实现了效率很高的sort函数在工作中调用,但是经典排序算法里面的许多思想值得借鉴以及深入学习。
以下是自己对几个经典排序的实现。

用到的交换两数的宏定义,以及数组初始化,输出函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include<windows.h>

#define SWAP(a,b) do {  temp = (a);\
    (a) = (b);\
    (b) = (temp);}while(0);

//随机生成N个整数
void init_array(int a[],int n)
{
    int i ;
    srand((int)time(NULL));

    for (i=0;i<n;i++)  //随机生成 0 - 100
    {
        a[i] = rand()%100 ;
    }

    printf("随机生成了 %d 个整数 \n",n);
    for (i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}

//打印数组元素
void showArray(int a[],int n)
{
    int i ;
    printf("现在数组中的序列为:\n");
    for (i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}

冒泡排序

这是最简单的一种排序了,总结就是一句话,n个元素比较n-1趟,每趟比较n-1-i次。
具体代码:

//冒泡排序  (我个人习惯:n个元素比较n-1趟,每趟比较n-1-i次)
void sort_buble_AmyStyle(int a[],int size)
{
    int i ,j;
    for (i=0;i<size-1;i++)
        for (j=0;j<size-1-i;j++)
        {
            if (a[j]>a[j+1])
            {
                SWAP(a[j],a[j+1]);
            }
        }
}

测试代码&运行截图:
这里写图片描述

选择排序

思想很简单,每次选择未排序序列中最小(最大)的元素即可。
具体实现代码:

//选择排序  每次选取最小值的位置,并记录最小值
void sort_select(int a[],int size)
{
    int i ,j ,min_index ;

    for (i=0;i<size;i++)
    {
        min_index = i;
        for (j=i;j<size;j++)
        {

            if (a[min_index]>a[j])
                min_index = j;
        }
        SWAP(a[i],a[min_index]);
    }


    //这是用了一个 min_value ,其实可以省略,只需要最小值的下标就够了
    /*for (i=0;i<size;i++)
    {
        min_value = a[i];
        min_index = i;
        for (j=i;j<size;j++)
        {
            if (min_value>a[j])
            {
                min_index = j;
                min_value=a[j];
            }
        }
        SWAP(a[i],a[min_index]);
    }*/
}

测试代码运行截图:
这里写图片描述

插入排序

算法导论中的描述十分精彩,扑克牌的排序就是插入排序。
具体实现代码(略有难度):

//插入排序 第一个元素默认有序,后面的元素依次往前插,插之前先往后移动
void sort_insert_myStyle(int a[],int size)
{
    int i ,j; 
    int insert_value=a[0];

    //数组第一个元素当做有序数列,从第二个元素开始依次往前比较,然后插入
    for(i = 1;i<size;i++) 
    {
        if (a[i-1] > a[i])  // (a[i]<a[i-1]) 
        {
            insert_value =a[i];
            for (j = i-1;insert_value<a[j]&& j>=0;j--)//向后移动 
            {
                  a[j+1] = a[j];
            }
            a[j+1] = insert_value;  //
        }
    }
}

测试代码&运行截图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值