排序

1. 冒泡排序(从小到大)

自己的理解:有多少数就有多少轮,第一轮将最大的数放在最后(使用当前数和后一位数的比较),第二轮将第二大的数放在倒数第二,依次排好。

#include<stdio.h>
void BubbleSort(int a[],int len)
{
    int i, j, temp;
    for(i = 0; i < len; i++) //表示输入数组的所有数
        for(j = 0; j < len-1-i; j++) //从数组第一个元素开始遍历
            if(a[j] > a[j+1]) //与或后一个元素比较
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }//交换
}
int main()
{
    int i, len;
    int a[len];
    scanf("%d", &len);
    for(i = 0; i < len; i++)
        scanf("%d",&a[i]);
        
    BubbleSort(a, len);
    
    for(i = 0; i < len; i++)
        printf("%d ",a[i]); 
    return 0;
} 

2. 选择排序

自己的理解:将数组第一个下标赋给index,然后对数组中index下标后的数进行遍历并进行判断大小,若比a[index]小,则将该数下标赋给index,若相等或比a[index]大,则继续使用下一个数进行比较,比较完所有的数,得到的index指向后面的数中最小的数。

#include<stdio.h>
void SelectionSort(int a[], int len)
{
    for (int i = 0; i < len; i++)
    {
        int index = i;
        for (int j = i+1; j < len; j++)
        {
            if (a[j] < a[index])
            {
                index = j;
            }
        }
        if (index == i)
            continue;
        else
        {
            int temp;
            temp = a[index];
            a[index] = a[i];
            a[i] = temp;
        }
    }
}
int main()
{
    int i, len;
    int a[len];
    scanf("%d", &len);
    for(i = 0; i < len; i++)
        scanf("%d",&a[i]);
    
    SelectionSort(a, len);

    for(i = 0; i < len; i++)
        printf("%d ", a[i]);
    return 0;
}

3. 插入排序

自己的理解:遍历数组 ,从第二个数开始,向前检索,若小于前面的数则将其后移,直到比前面的数大,比后面的数小,则该数插在小的数后。像扑克牌排序一样。

#include<stdio.h>
void InsertSort(int a[], int len)
{
    int i, j, temp;
    for (int i = 1; i < len; i++)
    {
        
        if (a[i] < a[i - 1])
        {
            temp = a[i]; //插入的值
            for (j = i - 1; j >= 0 && temp < a[j]; j--) //被插入的下标不能小于0
            {
                a[j + 1] = a[j];
            }
            a[j + 1] = temp;
        }
    }
}
int main()
{
    int i, len;
    int a[len];
    scanf("%d", &len);
    for(i = 0; i < len; i++)
        scanf("%d",&a[i]);
    
    InsertSort(a, len);
    
    for(i = 0; i < len; i++)
        printf("%d ", a[i]);
    return 0;
}

4. 快速排序

自己的理解:先找一个基准值(一般是数组第一位),将比基准值小的数放在其左边,大的数放在右边。利用递归分别将基准值左右两组数进行相同操作。

#include<stdio.h>
void QuickSort(int a[], int start, int end)
{
    if (start >= end)//当开始下标大于结束下表或者相等时,函数结束
        return;
    int i = start;
    int j = end;
    int base = a[start]; //基准数用base存起来
    while (i < j)
    {
        // 从右向左找比基准数小的数
        while (i < j && a[j] >= base)
        {
            j--;
        }
        if (i < j)
        {
            a[i] = a[j] //赋值后a[j]为无用的值
            i++;
        }
        // 从左向右找比基准数大的数
        while (i < j && a[i] < base)
        {
            i++;
        }
        if (i < j)
        {
            a[j] = a[i];
            j--;
        }
    }
    // 把基准数放到i的位置
    a[i] = base; //无用值用基准值填充
//跳出循环后,比基准值小的数在左边,比其大的在右边
    QuickSort(a, start, i - 1);// 基准值左边的数进行递归
    QuickSort(a, i + 1, end);//基准值右边的数进行递归
}
int main()
{
    int i, len;
    int a[len];
    scanf("%d", &len);
    for(i = 0; i < len; i++)
        scanf("%d",&a[i]);
    QuickSort(a, 0, len);
    for(i = 0; i < len; i++)
        printf("%d ", a[i]);
    return 0;
}

比较冒泡排序与选择排序:冒泡排序是每次判断交换一次位置,而选择排序是判断一个回合交换一次,选择排序的时间复杂度低。

未完待续...

5. 归并排序

6. 堆排序

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文首发于我的个人博客:尾尾部落 排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法...
    繁著阅读 9,999评论 3 118
  • 排序算法几种分类方式: 1,稳定排序和不稳定排序 如果a==b, 当排序之前a在b的前面,排序后,a仍然在b...
    fly_ever阅读 3,177评论 0 0
  • 前言 算法就是编程的灵魂,不会算法的程序员只配做码农。之前看到这句话受到一万点暴击伤害!同时也激起了自己的斗志,坦...
    Eran_promise阅读 9,736评论 3 16
  • 冒泡排序 冒泡排序相对来说是较为简单的一种排序,它的思想就是在每一次循环中比较相邻的两个数,通过交换的方式,将最小...
    陌上疏影凉阅读 3,660评论 0 3
  • 今天中午的时候,看到了一条朋友圈,那是一张图,图上写有如下几行字: 张一鸣:今天我要发布社交产品王欣:今天我要发布...
    暮光微晓破倾城阅读 3,529评论 5 20