温习排序算法(基于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.决策二叉树 回答这个问题之前我们先来玩一个猜数字的 ...
随机推荐
- JS使用小记
1. JSON解析undefined JSON.parse(undefined) VM4456:2 Uncaught SyntaxError: Unexpected token u 2. 事件传值 o ...
- Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- Git一些简单但非常重要并常用的操作命令
1.将本地与github进行关联配置 生成公钥 ssh-keygen -t rsa -C "jiasheng.mei@hpe.com" 将公钥拷贝到github中 在公钥同文件夹( ...
- entityframework单例模式泛型用法
public class yms_Entity<T> where T :DbContext { private static T _instance; public static read ...
- react-native清除android项目缓存的命令
cd到android目录下执行: ./gradlew clean
- Content Provider的启动过程
--摘自<Android进阶解密> 第一步:query方法到AMS的调用过程 1)ApplicationContentResolver是ContextImpl中的静态内部类,继承自Cont ...
- 通过 ContentResolver 读取联系人信息
1.首先动态获取 读取联系人信息权限 <1>配置文件中声明对应权限 ) } ] == PackageManager.PERMISSION_GRANTED) { readContact ...
- 【AtCoder】【DP】【思维】Prefix Median(AGC012)
模的是这位神犇的代码:Atcoder AGC012F : Prefix Median 题意: 在动态中位数那道题上做了一些改动.给你一个序列a,可以将a重新任意排序,然后对于a序列构造出b序列. 假设 ...
- ruby配合gem使用sass
Ruby环境安装 1.Ruby安装包下载地址:http://rubyinstaller.org/downloads/下载对应系统版本的安装包: 2.双击rubyinstaller-2.2.3-x64. ...
- Android SQL数据库应用实践 “问题点”“疑难点”“解析”
应用 Android SQL 数据库时,遇到的问题: 场景1:Android SQL查询后,获取到Cursor并查询数据:遇到以下问题:"android.database.CursorInd ...