博客
关于我
排序(插入排序、起泡排序、选择排序和快速排序)
阅读量: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/

    你可能感兴趣的文章
    Objective-C实现eval函数功能(附完整源码)
    查看>>
    Objective-C实现even_tree偶数树算法(附完整源码)
    查看>>
    Objective-C实现Exceeding words超词(差距是ascii码的距离) 算法(附完整源码)
    查看>>
    Objective-C实现extended euclidean algorithm扩展欧几里得算法(附完整源码)
    查看>>
    Objective-C实现Factorial digit sum阶乘数字和算法(附完整源码)
    查看>>
    Objective-C实现factorial iterative阶乘迭代算法(附完整源码)
    查看>>
    Objective-C实现factorial recursive阶乘递归算法(附完整源码)
    查看>>
    Objective-C实现Fast Powering算法(附完整源码)
    查看>>
    Objective-C实现fenwick tree芬威克树算法(附完整源码)
    查看>>
    Objective-C实现FenwickTree芬威克树算法(附完整源码)
    查看>>
    Objective-C实现fft2函数功能(附完整源码)
    查看>>
    Objective-C实现fibonacci斐波那契算法(附完整源码)
    查看>>
    Objective-C实现FigurateNumber垛积数算法(附完整源码)
    查看>>
    Objective-C实现Gale-Shapley盖尔-沙普利算法(附完整源码)
    查看>>
    Objective-C实现hamiltonianCycle哈密尔顿图算法(附完整源码)
    查看>>
    Objective-C实现hamming numbers汉明数算法(附完整源码)
    查看>>
    Objective-C实现hanning 窗(附完整源码)
    查看>>
    Objective-C实现hanoiTower汉诺塔算法(附完整源码)
    查看>>
    Objective-C实现hardy ramanujana定理算法(附完整源码)
    查看>>
    Objective-C实现harris算法(附完整源码)
    查看>>