博客
关于我
排序(插入排序、起泡排序、选择排序和快速排序)
阅读量:563 次
发布时间:2019-03-09

本文共 2617 字,大约阅读时间需要 8 分钟。

排序

一、二、插入排序

插入排序是一种简单而有效的排序算法,其思想是将一条记录插入到已排序的表中,使之保持有序。

1. 直接插入排序

直接插入排序是一种最常用的插入排序方法。

算法思想:逐步将记录插入到已排好序的有序表中。

实现代码

void InsertSort(int a[], int n) {    int i, j, t;    // 从第二个元素开始插入    for (i = 2; i <= n; i++) {        // 插入的位置        if (a[i-1] > a[i]) {            // 交换中间变量            t = a[i];            // 将要插入的元素向左移动            for (j = i-1; a[j] > t; j--) {                a[j+1] = a[j];            }            a[j+1] = t;        }    }}

2. 折半插入排序

与直接插入排序相比,折半插入排序在插入位置的选择上更优。

算法思想:采用折半查找法确定插入位置。

实现代码

void BInsertSort(int a[], int n) {    int i, j, t;    int low, high, mid;    // 控制循环的趟数,每一趟采用折半查找    for (i = 2; i <= n; i++) {        a[0] = a[i];        low = 1;        high = i - 1;        while (low <= high) {            mid = (low + high) / 2;            if (a[mid] >= a[0]) {                high = mid - 1;            } else {                low = mid + 1;            }        }        // 移动记录到正确位置        for (j = i-1; j >= high + 1; j--) {            a[j+1] = a[j];        }        a[high+1] = a[0];    }}

二、起泡排序

起泡排序是一种简单的稳定排序算法,逐步将较大的元素“冒泡”到已排序的位置。

算法思想:从前向后依次检查每一对相邻元素,发现逆序后交换位置。

实现代码

void BubSort(int a[], int n) {    int i, j, t;    // 控制循环的趟数    for (i = 1; i < n; i++) {        // 配对检查的范围逐渐缩小        for (j = 1; j <= n - i; j++) {            if (a[j] > a[j+1]) {                t = a[j];                a[j] = a[j+1];                a[j+1] = t;            }        }    }}

三、快速排序

快速排序是一种高效的分治排序算法,通过一次排序将记录分割成两部分。

算法思想:选择一个记录作为枢轴,将数组划分为两部分,分别对每一部分递归排序。

实现代码

// 第一趟排序int Partition(int a[], int low, int high) {    int pkey = a[low];    while (low < high) {        while (a[high] >= pkey && low < high) {            high--;        }        a[low] = a[high];        while (a[low] < pkey && low < high) {            low++;        }        a[high] = a[low];    }    a[low] = pkey;    return low;}// 递归排序void QSort(int a[], int low, int high) {    if (low < high) {        int mid = Partition(a, low, high);        QSort(a, low, mid - 1);        QSort(a, mid + 1, high);    }}// 适用于数组从索引1开始void QuickSort(int a[], int n) {    QSort(a, 1, n);}

四、简单选择排序

简单选择排序是一种稳定排序算法,通过每次选取最小记录来逐步建立排序。

算法思想

  • 第一趟:从n个记录中选择一个最小记录交换到第一个位置。
  • 第二趟:从剩下n-1个记录中选择一个最小记录交换到第二个位置。
  • 第三趟:依次类推,直到所有记录排好序。
  • 实现代码

    void SelectSort(int a[], int n) {    int i, j;    int min, t;    // 第一趟:找最小值放第一位    for (i = 1; i < n; i++) {        min = a[i];        for (j = i+1; j < n; j++) {            if (a[j] < min) {                min = a[j];            }        }        for (j = i+1; j >= (a[i] = min); j--) {            t = a[j];            a[j] = a[j-1];            a[j-1] = t;        }    }}

    通过以上各算法的理解和实现,可以方便地对不同数据量和规模的数据进行排序处理。

    转载地址:http://vytpz.baihongyu.com/

    你可能感兴趣的文章
    PostgreSQL和Oracle两种数据库有啥区别?如何选择?
    查看>>
    PostgreSQL学习总结(11)—— PostgreSQL 常用的高可用集群方案
    查看>>
    PostgreSQL学习总结(1)—— PostgreSQL 入门简介与安装
    查看>>
    PostgreSQL学习总结(2)—— PostgreSQL 语法
    查看>>
    PostgreSQL学习总结(3)—— PostgreSQL 数据类型
    查看>>
    PostgreSQL学习总结(6)—— PostgreSQL 模式(SCHEMA)详解
    查看>>
    PostgreSQL学习总结(7)—— PostgreSQL 语句 INSERT INTO、SELECT、UPDATE、DELETE 等学习
    查看>>
    PostgreSQL学习总结(8)—— PostgreSQL 基于数据库和基于模式(schema)的多租户分析
    查看>>
    PostgreSQL学习总结(9)—— PostgreSQL 运算符与表达式
    查看>>
    PostGreSql学习笔记001---PostgreSQL10.4安装(Windows)_支持PostGreGis_PostJDBC
    查看>>
    PostGreSql学习笔记002---Navicat Premium中管理PostGreSql 错误:字段rolcatupdate 不存在
    查看>>
    PostgreSQL学习笔记:PostgreSQL vs MySQL
    查看>>
    PostgreSQL实现shape数据转geojson数据(地图工具篇.18)
    查看>>
    PostgreSQL导入shape数据(地图工具篇.10)
    查看>>
    PostGreSql工作笔记003---在Navicat中创建数据库时报错rolcatupdate不存在_具体原因看其他博文_这里使用pgAdmin4创建管理postgre
    查看>>
    PostGreSql工作笔记004---PostGreSql修改密码_windows和linux下修改
    查看>>
    Postgresql常用命令行操作_以及Navicat操作PostGis时的问题_自动截取长度_WKB structure does not match exp---PostgreSQL工作笔记005
    查看>>
    PostgreSQL忘记密码
    查看>>
    PostgreSQL数据库pg_dump命令行不输入密码的方法
    查看>>
    PostgreSQL新手入门
    查看>>