以前学过的数据结构课,貌似已经忘得一干二净了,偶然又翻起,书中最后一章详细介绍了7种排序算法,现在对其中4种做个总结。(为啥只总结4种,当然是因为偷懒,只想总结简单又常用的!)

先贴一张排序分类图:

1.冒泡法:

主要思想:每次比较相邻的两个数,较小的数向上冒,较大的数向下沉。

演示效果:

C代码:(指针p指向待排序列的首地址,length是待排序列的总长度,下同)

swap(int *p1, int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
} Msort(int *p, int length)
{
BOOLEAN flag = TRUE;
for (int i = ; i < length && flag; i++){
flag = FALSE;
for (int j = length - ; j > i; j--)
if (*(p + j) < *(p + j - ))
{
swap(p + j, p + j - );
flag = TRUE;
}
}
}

2.简单选择法:

  主要思想:每轮循环找到一个最小数的标号,循环结束后进行一次交换。

演示效果:

C代码:

swap(int *p1, int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
Xsort(int *p, int length)
{
for (int i = ; i < length - ; i++){
int min = i;
for (int j = i + ; j < length; j++){
if (*(p + j) < *(p + min))
min = j;
}
if (min != i)
swap(p + i, p + min);
}
}

3.直接插入法:

   主要思想:每轮循环都是实现将一个新来的数插入到原有的一个有序子序列中。

演示效果:

  

C代码:

swap(int *p1, int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
} Csort(int *p, int length)
{
for (int i = ; i < length; i++){
if (*(p + i) < *(p + i - )){
int tmp = *(p + i);
int j;
for (j = i - ; j >= && *(p + j) > tmp; j--)
*(p + j + ) = *(p + j);
*(p + j + ) = tmp;
}
}
}

4.快速排序法:

冒泡排序的升级版,同属于交换排序。

   主要思想:通过递归,不断地二分序列,使相对较大的数位于一边,相对较小的数位于另一边。

演示效果:

C代码:

swap(int *p1, int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
} int partition(int *p, int startIdx, int endIdx)
{
int pivotkey;
pivotkey = *(p + startIdx);
while (startIdx < endIdx)
{
while (startIdx < endIdx && *(p + endIdx) >= pivotkey)
endIdx--;
swap(p + startIdx, p + endIdx); while (startIdx < endIdx && *(p + startIdx) <= pivotkey)
startIdx++;
swap(p + startIdx, p + endIdx);
}
return startIdx;
} Ksort(int *p, int startIdx,int endIdx)
{
int pivot;
if (startIdx < endIdx)
{
pivot = partition(p,startIdx,endIdx);
Ksort(p, startIdx, pivot - );
Ksort(p, pivot + , endIdx);
}
}

5.举例:

//2018-8-20
//by-lengwawa #include<stdio.h>
#include<Windows.h> //程序中的BOOLEAN在该头文件中定义 main()
{
int n, i;
int *p;
p = NULL; printf("请输入需要排序的个数:");
scanf_s("%d", &n);
p = (int *)malloc(n*sizeof(int)); printf("\n请输入%d个待排序的数:", n);
for (int k = ; k < n; k++)
scanf_s("%d", p + k); printf("\n你要使用哪种排序法(1——冒泡 2——选择 3——插入 4——快排):"); scanf_s("%d", &i); printf("\n");
if (i == )
{
printf("使用冒泡排序法的结果是:");
Msort(p, n);
for (int j = ; j < n; j++)
printf("%d ", *(p + j));
printf("\n\n\n");
}
else if (i == )
{
printf("使用选择排序法的结果是:");
Xsort(p, n);
for (int j = ; j < n; j++)
printf("%d ", *(p + j));
printf("\n\n\n");
}
else if (i == )
{
printf("使用插入排序法的结果是:");
Csort(p, n);
for (int j = ; j < n; j++)
printf("%d ", *(p + j));
printf("\n\n\n");
}
else
{
printf("使用快速排序法的结果是:");
Ksort(p, , n - );//这里是标号,所以是n-1
for (int j = ; j < n; j++)
printf("%d ", *(p + j));
printf("\n\n\n");
}
}

6.输出:

7.把另外3个的gif演示放一下吧,有兴趣的看看

选择法升级版——堆排序

  

插入法升级版——希尔排序

  

归并排序:

  

温习排序算法(基于C指针)的更多相关文章

  1. 常见排序算法基于JS的实现

    一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...

  2. 排序算法 基于Javascript

    写在前面 个人感觉:javascript对类似排序查找这样的功能已经有了很好的封装,以致于当我们想对数组排序的时候只需要调用arr.sort()方法,而查找数组元素也只需要调用indexOf()方法或 ...

  3. 八大排序算法---基于python

    本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...

  4. Stooge排序与Bogo排序算法

    本文地址:http://www.cnblogs.com/archimedes/p/stooge-bogo-sort-algorithm.html,转载请注明源地址. Stooge排序算法 Stooge ...

  5. CompareTo 基于的排序算法

    CompareTo 基于的排序算法(高级排序) 这个是今天学习MapReduce时发现的,自定义类后实现了WritableComparable<>接口后实现了接口中的compareTo方法 ...

  6. 第32讲:List的基本操作实战与基于模式匹配的List排序算法实现

    今天来学习一下list的基本操作及基于模式匹配的排序操作 让我们从代码出发 val bigData = List("hadoop","spark") val d ...

  7. 排序算法总结(基于Java实现)

    前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...

  8. C语言利用指针排序与选择排序算法

    //读入字符串,并排序字符串 #include <stdio.h> #include <string.h> #define SIZE 81 #define LIM 20 #de ...

  9. 转载~基于比较的排序算法的最优下界为什么是O(nlogn)

    基于比较的排序算法的最优下界为什么是O(nlogn) 发表于2013/12/21 16:15:50  1024人阅读 分类: Algorithm 1.决策二叉树 回答这个问题之前我们先来玩一个猜数字的 ...

随机推荐

  1. (原创)cocos2dx-lua TableView官方demo分析

    本来是想看看网上的教程文章,结果看了好几篇,复制代码各种报错,有很多不存在的类和变量,根本用不了. 所以干脆自己去看官方demo,经过自己分析测试,已经大概会用了,顺便记录一下. 以下是代码,复制粘贴 ...

  2. for/while循环运用(do while)

    //for循环用于知道次数的循环,while用于不知道的次数的循环//第1种写法 while循环 import java.util.Scanner;//插入util工具包 public class H ...

  3. Reveal 使用详解

    Reveal是一款调试iOS程序UI界面的神器 官网:https://revealapp.com 下载:https://revealapp.com/download/ 建议下载至少Reveal4版本, ...

  4. Composer更新慢的解决方案

    有两种方式启用镜像服务: 系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中. 单个项目配置: 将配置信息添加到某个项目的 composer.json 文 ...

  5. jquery刷新页面代码

    window.location.reload()刷新当前页面.parent.location.reload()刷新父亲对象(用于框架)opener.location.reload()刷新父窗口对象(用 ...

  6. JDK配置环境变量不成功的原因

    根据自己配置环境变量遇到的问题进行总结: 1.二次安装需要注意的问题 由于已经安装了一次的原因,此时的注册表已经有了安装记录. 建议删除jdk的记录 首先打开注册表 开始菜单→运行.或者直接键盘按下W ...

  7. js 把 json 转为以 ‘&’ 连接的字符串

    /** * URL编码; * @param {参数} param */ export function toParams(param) { var result = "" for ...

  8. Wireshark简单使用教程1——附视频

    目录 Wireshark的简介 Wireshark面向的用户 Wireshark的下载安装 Wireshark抓取一个流量包 内容 1.Wireshark的简介 Wireshark(前称Etherea ...

  9. /var/spool/clientmqueue目录~清理

    今天nagios报警,一台服务器的disk满了,使用du -sh * 或 du -sh /* 查看目录的大小,查找占用空间大的目录/var/spool/clientmqueue.... 然后我就想/v ...

  10. php发送邮箱

    /** * 系统邮件发送函数 * @param string $tomail 接收邮件者邮箱 * @param string $name 接收邮件者名称 * @param string $subjec ...