排序

作者: Airjoden | 来源:发表于2019-02-06 20:26 被阅读0次

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. 堆排序

相关文章

  • 【恋上数据结构与算法二】(一)排序(Sorting)

    排序方法 冒泡排序 选择排序 堆排序 插入排序 归并排序 快速排序 希尔排序 计数排序 基数排序 桶排序 初识排序...

  • 排序-冒泡排序

    排序系列传递门 排序—选择排序排序—快速排序排序—插入排序排序-希尔排序(待完善)排序—归并排序(待完善)排序—基...

  • 排序

    冒泡排序: 冒泡排序 选择排序: 插入排序: 希尔排序: 归并排序: 快速排序: 堆排序: 计数排序: 桶排序: ...

  • Java | 10种排序算法

    冒泡排序 选择排序 插入排序 希尔排序 计数排序 基数排序 堆排序 归并排序 快速排序 桶排序

  • 常见的排序

    冒泡排序: 选择排序: 插入排序: 快速排序: 希尔排序: 归并排序: 堆排序: 计数排序: 桶排序: 基数排序:

  • 002--20200409刷题

    冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序

  • 排序

    排序 符号:Θ 插入排序 选择排序 堆排序 归并排序 冒泡排序 快速排序 桶排序 基数排序 计数排序 插入排序 插...

  • 排序 -- 选择/插入

    聊聊排序吧 冒泡排序 选择排序 插入排序 快速排序 归并排序 计数排序 桶排序 堆排序 本篇 选择排序与插入排序 ...

  • 前端基础整理 | 算法基础

    排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序

  • Java 常见的 8 种排序算法(内排序)

    排序分类 内部排序 插入排序:直接插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:直接选择排序、堆排序...

网友评论

      本文标题:排序

      本文链接:https://www.haomeiwen.com/subject/hgqisqtx.html