温习排序算法(基于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.决策二叉树 回答这个问题之前我们先来玩一个猜数字的 ...
随机推荐
- JavaScript入门(基础)
一.JS语言介绍 1.概述 浏览器脚本语言 可以编写运行在浏览器上的代码程序 属于解释性.弱语言类型编程语言 2.组成 ES语法:ECMAScript.主要版本有ES5和ES6 DOM:文档对象模型( ...
- java的官网下载(如有不懂,可以去我发的视频网站,那里面有详细过程)
https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase9-3934878.html java 9的下载 ...
- hdu3709 数位dp
枚举fix所在的位置loc即可,然后数位dp即可 这题要注意一种特殊情况,就是所有位都是0的时候对于每个fix都是成立的 /* dp[i][j][k]表示前i位确定了平衡点在第j位,前i位和为k fi ...
- EurekaClient项目启动报错Invocation of destroy method failed on bean with name 'scopedTarget.eurekaClient': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'e
Disconnected from the target VM, address: '127.0.0.1:51233', transport: 'socket' Eureka Client的使用 使用 ...
- sql server 中getdate() 的日期时间字符串表示法
1. SELECT CONVERT(varchar(100), GETDATE(), 0) 05 9 2011 9:12AM SELECT CONVERT(varchar(100), GETDATE( ...
- 西北地区打不开github的解决办法~
泱泱我大西北,github打不开,的确痛苦的. http://ipaddress.com/ip_lookup/ 先查github.com 可能存在打不开的情况~ 随便找一个web在线代理,就可以查到了 ...
- vim编辑器操作命令
vim [参数] [文件 ..] 编辑指定的文件 或: vim [参数] - 从标准输入(stdin)读取文本 或: vim [参数] -t ...
- python 3 爬取某小说网站小说,注释详细
目标:每一个小说保存成一个txt文件 思路:获取每个小说地址(图一),进入后获取每章节地址(图二),然后进入获取该章节内容(图三)保存文件中.循环 效果图: 每一行都有注释,不多解释了 import ...
- 05-Python入门学习-字符串与列表的内置方法
字符串 一:基本使用 1 用途: 记录描述性的状态,比如人的名字.地址.性别 2 定义方式: 在"",'',"""""" ...
- Arrange the Bulls [POJ2441] [状压DP]
题意 n头牛,m个房间,每头牛有自己喜欢的房间,问每头牛都住进自己喜欢的房间有多少种分配方法? Input In the first line of input contains two intege ...