算法基础例一冒泡、选择、插入

概述

因为快要找工作了,最近在看左神的算法视频课程,打算用博客的方式记录一下课程中的所有例程。如果有侵权请告知,立即删。

冒泡排序

冒泡排序简单的理解就是:相邻元素依次比较,小的数放前面,大的数放后面。例如 输入数据6 1 7 5 4 6和1进行比较,6大(1小),则顺序变成1 6 7 5 4
同理6和7比较,7大(6小),则顺序不变还是1 6 7 5 4
7和5比较,5小(7大),则顺序为1 6 5 7 4
7和4进行比较,7大(4小),则顺序变成1 6 5 4 7
则数组中最大的数到了最右边,第一轮结果就排好了。依次轮流下来,就可以排好整个数组。可以看出,整个过程的复杂度为O(N*N),因为排完一轮需要N次,一共需要排N轮。
再看看程序

# include <stdio.h>
int main(void)
{
    //假设需要排序的数组为a[]
    int a[] = {500, 22, 53, -158, 4, 86, 32, 33, 26, -70, 135, -34, 32, 543, 2500};
    int n;  //存放数组a中元素的个数
    int i;  //比较的轮数
    int j;  //每轮比较的次数
    int buf_temp;  
    n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节*/
    for (i = n-1; i >= 0; i --)  //比较n-1轮
    {
        for (j = 0; j < i; j ++)  //每轮比较i次
        {
            if (a[j] < a[j+1])
            {   //进行数据交换
                buf_temp = a[j];
                a[j] = a[j+1];
                a[j+1] = buf_temp;
            }
        }
    }
    for (i = 0; i < n; i ++)
    {
        printf("%d\t", a[i]);
    }
    printf("\n");
    return 0;
}
选择排序

选择排序的思想:在一个长度为N的数组中,先从N个元素中找到最小值与第一位元素进行交换(如果没有比第一位元素还要小,则不需要交换,后面的类推),再从N-1中找到最小值与第二位元素进行交换,,,直至排到N-1位元素(N位元素自动排到最后一位)。因为操作是等差序列,复杂度为O(N*N)。这个例子和冒泡法很类似,也比较简单,这里就不举例子了。直接上代码吧。

# include <stdio.h>
int main(void)
{
    int a[] = {500, 22, 53, -158, 4, 86, 32, 33, 26, -70, 135, -34, 32, 543, 2500};
    int n;  //存放数组a中元素的个数
    int i;  //比较的轮数
    int j;  //每轮比较的次数
    int buf_temp;  
    int temp_min; 
    n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节*/
    for (i = 0; i< n-1; i ++)  //比较n-2轮
    {
    	temp_min = i;  //i次循环时最小值都是第i个 
    	
        for (j = i+1; j < n-1; j ++)  //从i+1到n-1个元素进行比较 
        {
            if (a[j] < a[temp_min])  //发现比第i个元素还小,则交换 
            {
                buf_temp = a[j];
                a[j] = a[temp_min];
                a[temp_min] = buf_temp;
            }
        }
    }
    for (i=0; i<n; ++i)
    {
        printf("%d\t", a[i]);
    }
    printf("\n");
    return 0;
}
插入排序

插入排序的思想类似打扑克牌:从未排序元素部分中,按元素下标,依次抽出一个数,插入已经完成排序的部分,最大值位置。
例如,第一步,先将数组a[N]分成已经排序的和未排序的。因为一开始,所以a[0]是排好序的,a[1]至a[N-1]是未排序的。则抽出未排序部分的a[1]放到已经完成排序的部分,a[1]与a[0]进行比较,谁大谁在后面。这样a[0]、a[1]就排好序了。第二步,数组a[N]分成已经排序的和未排序的。a[0]和a[1]已经排好序了,a[2]和a[N-1]未排序,则抽出a[2]放到a[0]和a[1]中进行依次比较,进行排序。依次类推,则抽出a[3]、a[4]、、、一直到a[N-1]。
时间复杂度计算:依然是一个等差序列,复杂度为O(N*N)。
程序如下:

# include <stdio.h>
int main(void)
{
    int a[] = {500, 22, 53, -158, 4, 86, 32, 33, 26, -70, 135, -34, 32, 543, 2500};
    int n;  //存放数组a中元素的个数
    int i;  //比较的轮数
    int j;  //每轮比较的次数
    int temp_min; 
    n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节*/
    for (i = 1; i< n; i ++)  //比较n-1轮
    {
    	temp_min = a[i];  //未完成排序的中,需要插入完成排序的元素,就是它了 
    	j = i-1; 
        while((j >= 0) && (a[j] > temp_min))//准备插入的元素与完成排序的元素依次比较 
        {
			a[j+1] = a[j];       //但比较的顺序是从后往前 
			j--;               //发现有比它大的数,数组就往后挪一下,留出空位置 
        }
                               
        a[j+1] = temp_min; //没有比它还小的,就把它放在那个空位置上去 
    }                      //空位置的下标j--了,需要加1,才能到空位置上去 
    for (i=0; i<n; ++i)
    {
        printf("%d\t", a[i]);
    }
    printf("\n");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经纬的无疆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值