手撕七大排序 (二)

简介: 手撕七大排序 (二)

交换排序


一. 冒泡排序


现在我们给大家一个无序数组 要求是我们要将最大的数字放到数组最后面去


这个时候大家应该是怎么想的呢?


1.我们可以遍历一遍数组然后找到一个最大的值 放到最后去 (这个我们待会儿讲)

2.我们将这个数字和后面的数字进行比较 如果前面的数字比较大 就交换它们 如果不大于 就比较下面的数字和后面的数字 这样比较一趟 最大的数字就到最后面了


f5a24c4657084a8ba0048ebedbe4ec51.png

我们首先来谢谢单趟冒泡排序的代码


1. 单趟冒泡排序


也就是将一个数字放到最后的冒泡排序


代码表示如下

void Bubblesort1(int* arr, int size)
{
  // assert
  assert(arr);
  // 将最大的数字放到最后面
  int i = 0;
  int tmp = 0;
  for ( i = 0; i < size - 1; i++)
  {
    // 比较大小
    if (arr[i]>arr[i+1])
    {
      tmp = arr[i];
      arr[i] = arr[i + 1];
      arr[i + 1] = tmp;
    }
  }
}


我们来看看结果

1b3b564602ca4d13aed5c7abd08faf6a.png


我们发现可以完美运行


2. 多趟排序


我们想想看 既然每次排序能够将最大的数字放到最后去


我们是不是可以在经过(x-1)次排序之后将x个数字排序完成啊


既然如此 我们开始实现完全体的冒泡排序


代码表示如下


void Bubblesort(int* arr, int size)
{
  // assert
  assert(arr);
  // i表示躺数 j表示每一趟排序需要做的事情 tmp临时变量
  int i = 0;
  int j = 0;
  int tmp = 0;
  for ( i = 0; i < size-1; i++)
  {
    for ( j = 0; j < size - 1 - i; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        // 比较
        if (arr[j]>arr[j+1])
        {
          tmp = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = tmp;
        }
      }
    }
  }
}


还是一样我们来看看效果怎么样


85aa5c3fad5047f7b00da98f98f228c7.png


可以完美运行


二. 快速排序


这个排序很难 并且会有很多变形


所以我会用单独的一篇博客来介绍


介绍完之后会将连接贴到这篇博客里面


选择排序


一. 选择排序


1. 单趟选择排序


还记不记得我们上面讲的一句话


168e61b5c0c845fd8962e20c2678ab8b.png


我们这里设定只要设定一个最大值 依次遍历整个数组 并且在最后将这个最大值放到数字后面就可以


代码表示如下


void selectionsort1(int* arr, int size)
{
  // assert
  assert(arr);
  // 设定一个最大值(下标) 遍历整个数组找到最大的
  int maxi = 0;
  int i = 0;
  for ( i = 0; i < size; i++)
  {
    if (arr[i] > arr[maxi])
    {
      maxi = i;
    }
  }
  // 最后交换位置
  int tmp = 0;
  tmp = arr[maxi];
  arr[maxi] = arr[size - 1];
  arr[size - 1] = tmp;
}


2. 完整选择排序


跟冒泡排序的思想及其相似


使用i控制排序的次数


使用j来控制每次排序


整体代码如下


void selectionsort(int* arr, int size)
{
  // assert
  assert(arr);
  // 还是一样 i控制多少次 j控制每一次的选择排序
  int i = 0;
  int j = 0;
  int maxi = 0;
  int tmp = 0;
  for ( i = 0; i < size-1; i++)
  {
    for (j = 0; j < size - 1 - i; j++)
    {
      if (arr[j]>arr[maxi])
      {
        maxi = j;
      }
    }
    tmp = arr[size - 1 - i];
    arr[size - 1 - i] = arr[maxi];
    arr[maxi] = tmp;
  }
}

7b0868cdd4c0482c983777de5a52ce15.png


二. 堆排序


堆排序已经在前面的博客中介绍了


大家可以参考下我的这篇博客

相关文章
|
5月前
|
算法 搜索推荐 数据可视化
【漫画算法】插入排序:插入宝石的传说
【漫画算法】插入排序:插入宝石的传说
|
6月前
|
算法 前端开发 索引
2624. 蜗牛排序
2624. 蜗牛排序
33 0
|
6月前
|
安全 Java C语言
手撕各种排序(上)
手撕各种排序
50 0
|
6月前
|
算法 搜索推荐 索引
手撕各种排序(下)
手撕各种排序(下)
58 0
|
6月前
|
搜索推荐
手撕各种排序(中)
手撕各种排序(中)
64 0
|
搜索推荐 算法
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
106 0
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
|
算法 搜索推荐 Java
手撕八大排序(下)
手撕八大排序(下)
48 0
手撕八大排序(下)
|
搜索推荐
手撕八大排序(上)
手撕八大排序(上)
115 0
手撕八大排序(上)
|
算法 C++
【快乐手撕LeetCode题解系列】——删除有序数组中的重复项
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享【快乐手撕LeetCode题解系列】——删除有序数组中的重复项~ 都是精华内容,可不要错过哟!!!😍😍😍
63 0
|
算法 C++
【快乐手撕LeetCode题解系列】——合并两个有序数组
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享【快乐手撕LeetCode题解系列】——合并两个有序数组~ 都是精华内容,可不要错过哟!!!😍😍😍
63 0