排序前言&冒泡排序

简介: 排序前言&冒泡排序



排序概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

  • 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。
  • 内部排序:数据元素全部放在内存中的排序。
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。  

排序应用

排序的应用场景很多: 学校医院品牌的排名等等。

算法当中也常用,二分查找,去重算法等等。

常见的排序算法  

  • 冒泡排序
  • 直接插入排序&VS冒泡排序
  • 希尔排序(在插入排序的基础上)
  • 选择排序VS堆排序
  • 快速排序
  • 归并排序
  • 补充:外排序
  • 排序的OJ题目
  • 排序的思想:先单趟再多趟,注意结束条件❗先局部再整体

BubbleSort冒泡排序

整体思路

  • 通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒泡。
  • 一趟:两两比较(若顺序则不交换,若逆序则交换)
  • 整体:重复上述过程,直到全部数组元素都每趟完成。
  • 优化:若某一趟发现,数组元素已经顺序不用继续冒泡下去,停止冒泡。(效率提高)

图解分析

代码实现

每趟

  • n个数的下标是0~n-1
  • i每次从0开始,则比较的是下标为ii+1的数值
  • i每次从1开始,则比较的是下标为i-1i的数值
  • 注意:i每次从第一个数值开始冒泡,不是第j格数值开始冒泡
写法1
//写法1
  for (int i = 0; i < n-1; i++)
  {
    if (a[i] > a[i + 1])//i=n-1就越界了
    {
      Swap(&a[i], &a[i + 1]);
    }
  }
写法2
//写法2
  for (int i = 1; i < n; i++)
  {
    if (a[i - 1] > a[i])//i=n-1没有越界,
    {
      Swap(&a[i - 1], &a[i]);
    }
  }

代码NO1

void Swap(int* p1, int* p2)
{
  int tmp = *p1;
  *p1 = *p2;
  *p2 = tmp;
}
void BubbleSort(int* a, int n)
{
  for (int j = 0; j < n; j++)
  {
    //一趟
    for (int i = 0; i < n - 1 - j; i++)//i要从第一个开始交换
    {
      if (a[i] > a[i + 1])//i=n-1就越界了
      {
        Swap(&a[i], &a[i + 1]);
      }
    }
    }

代码NO2优化

void Swap(int* p1, int* p2)
{
  int tmp = *p1;
  *p1 = *p2;
  *p2 = tmp;
}
void BubbleSort(int* a, int n)
{
  for (int j = 0; j < n; j++)
  {
    //一趟
    bool exchange = false;
    for (int i = 0; i < n - 1 - j; i++)//i要从第一个开始交换
    {
      if (a[i] > a[i + 1])//i=n-1就越界了
      {
        Swap(&a[i], &a[i + 1]);
        exchange = true;
      }
    }
    if (exchange == false)
    {
      break;
    }
    }
}

时间复杂度

时间复杂度:经典的O(N^2)

🙂感谢大家的阅读,若有错误和不足,欢迎指正!

目录
相关文章
|
4月前
|
搜索推荐 算法
常见排序算法以及冒泡排序的基础使用方法
常见排序算法以及冒泡排序的基础使用方法
16 0
|
7月前
|
算法 搜索推荐
重点算法排序之快速排序、归并排序(上篇)
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
30 0
|
12月前
|
算法 搜索推荐 JavaScript
【HDU 1425】 一个案例明白冒泡排序和快速排序
【HDU 1425】 一个案例明白冒泡排序和快速排序
84 0
|
机器学习/深度学习 搜索推荐 算法
数据结构与算法:排序
学习数据结构中的排序算法
数据结构与算法:排序
|
存储 算法 搜索推荐
【C语言程序设计】知识点汇总7——排序与查找原理与代码(冒泡排序,选择排序,插入排序,二分查找)
【C语言程序设计】知识点汇总7——排序与查找原理与代码(冒泡排序,选择排序,插入排序,二分查找)
139 0
|
人工智能 算法 搜索推荐
C/C++的三种入门排序方法
C/C++的三种入门排序方法:冒泡排序、插入排序、选择排序。什么是冒泡排序?什么是插入排序?什么是选择排序?它们的定义、设计思路、动图演示与代码实现
100 1
C/C++的三种入门排序方法
【c++】排序还在用冒泡排序?快来了解sort函数
【c++】排序还在用冒泡排序?快来了解sort函数
73 0
|
算法 搜索推荐 Java
【排序】交换类排序—冒泡排序、快速排序手撕图解
欢迎大家关注我的数据结构与算法专栏哈!,无论是日后面试还是笔试的,排序在数据结构与算法中有着举足轻重的地位,所以还是决定把数据结构这个专题好好写写,多研究研究!今天和大家一起学习交换类排序——冒泡和快排详解!
122 0
【排序】交换类排序—冒泡排序、快速排序手撕图解
|
搜索推荐 数据可视化 Java
【笔记16】排序算法:冒泡排序
排序:把一串没有按照顺序排列的数按照升序或降序排列。 排序前:1、6、2、7、8、3、9、5、4 升序:1、2、3、4、5、6、7、8、9 降序:9、8、7、6、5、4、3、2、1
118 0
【笔记16】排序算法:冒泡排序
|
搜索推荐 算法 测试技术
数据结构从入门到精通(第四篇) :排序的入门(插入排序,希尔排序,选择排序,冒泡排序)
数据结构从入门到精通(第四篇) :排序的入门(插入排序,希尔排序,选择排序,冒泡排序)
数据结构从入门到精通(第四篇) :排序的入门(插入排序,希尔排序,选择排序,冒泡排序)