温习排序算法(基于C指针)
以前学过的数据结构课,貌似已经忘得一干二净了,偶然又翻起,书中最后一章详细介绍了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指针)的更多相关文章
- 常见排序算法基于JS的实现
一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...
- 排序算法 基于Javascript
写在前面 个人感觉:javascript对类似排序查找这样的功能已经有了很好的封装,以致于当我们想对数组排序的时候只需要调用arr.sort()方法,而查找数组元素也只需要调用indexOf()方法或 ...
- 八大排序算法---基于python
本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...
- Stooge排序与Bogo排序算法
本文地址:http://www.cnblogs.com/archimedes/p/stooge-bogo-sort-algorithm.html,转载请注明源地址. Stooge排序算法 Stooge ...
- CompareTo 基于的排序算法
CompareTo 基于的排序算法(高级排序) 这个是今天学习MapReduce时发现的,自定义类后实现了WritableComparable<>接口后实现了接口中的compareTo方法 ...
- 第32讲:List的基本操作实战与基于模式匹配的List排序算法实现
今天来学习一下list的基本操作及基于模式匹配的排序操作 让我们从代码出发 val bigData = List("hadoop","spark") val d ...
- 排序算法总结(基于Java实现)
前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...
- C语言利用指针排序与选择排序算法
//读入字符串,并排序字符串 #include <stdio.h> #include <string.h> #define SIZE 81 #define LIM 20 #de ...
- 转载~基于比较的排序算法的最优下界为什么是O(nlogn)
基于比较的排序算法的最优下界为什么是O(nlogn) 发表于2013/12/21 16:15:50 1024人阅读 分类: Algorithm 1.决策二叉树 回答这个问题之前我们先来玩一个猜数字的 ...
随机推荐
- iOS 中的特殊字面量表示方法
转义字符\0(空字符).\\(反斜线).\t(水平制表符).\n(换行符).\r(回车符).\"(双引号).\‘(单引号).单字节 Unicode 标量,写成\xnn,其中nn为两位十六进制 ...
- apache 配置反向代理 设置
1.下载 安装 下载地址:http://httpd.apache.org/download.cgi 将apache 安装到某个目录中 修改conf/http.conf文件 修改配置文件端口 (端口为 ...
- apache基础
apache基于多域名的虚拟主机 NameVirtualHost *:80<VirtualHost *:80> DocumentRoot "/var/www/html/xk/sh ...
- vmware安装centOs操作系统配置网络的一系列问题
1:最近公司在测试项目,需要在linux操作系统上面测试,可惜自己之前学linux操作系统不是很深,配置网络也不是很熟练,网上方法太多,但是不是很好用,确实难为了自己一把,在这里自己总结一下配置网络的 ...
- docker /var/lib/docker/aufs/mnt 目录满了,全是垃圾数据
#!/bin/sh echo "==================== start clean docker containers logs ======================= ...
- Elasticsearch 简单快照备份
创建仓库 POST http://10.10.14.201:9200/_snapshot/backup { "type": "fs", "settin ...
- 解决 RecyclerView 在Android Studio已经导入情况下还无法实例引用问题
系统:Windows 10 IDE::android studio 1. 问题:RecyclerView 在Android Studio已经导入情况下还无法实例引用问题 由于RecyclerView是 ...
- python经典书籍推荐:Python核心编程
作者:熊猫烧香 链接:www.pythonheidong.com/blog/article/27/ 来源:python黑洞网 对<Python核心编程>的褒奖 “ The long-awa ...
- 解决:coursera 视频总是缓冲或者无法观看
关于这个问题,网上有很多的答案,但是可能我是win10 最近才更新了的,网上的方法都不能完全解决,然后自己搜了哈,最后综合自己解决了.具体方法如下. 在开始菜单中打开运行命令,输入gpedit.msc ...
- Linux内核笔记:epoll实现原理(一)
一.说明 针对的内核版本为4.4.10. 本文只是我自己看源码的简单笔记,如果想了解epoll的实现,强烈推荐下面的文章: The Implementation of epoll(1) The Imp ...