以前学过的数据结构课,貌似已经忘得一干二净了,偶然又翻起,书中最后一章详细介绍了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. Jquyer相册

    点击图片然后弹出相册列表,效果如下: html代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&q ...

  2. Axis接口

    Axis支持三种web service的部署和开发,分别为: 1.Dynamic Invocation Interface ( DII) 2.Dynamic Proxy方式 3.Stubs方式Dyna ...

  3. 初学者如何理解tomcat服务器?

    Tomcat介绍:Tomcat服务器是一个免费的开放源代码的Web应用服务器.当配置正确时,Apache为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet.另外,Tomcat和II ...

  4. Javascript—DOM

    1.什么是DOM? DOM 是 W3C(万维网联盟)的标准.DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本 ...

  5. python第10天(上)

    multiprocessing包是Python中的多进程管理包.与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程.该进程可以运行在Py ...

  6. python---单向循环链表实现

    这个判断比较多了. 一次审准,注释作好, 以后就可以照搬这些功能代码了. # coding = utf-8 # 单向循环链表 class Node: def __init__(self, new_da ...

  7. php获取两个时间戳之间相隔多少天多少小时多少分多少秒

    /** * 返回两个时间的相距时间,*年*月*日*时*分*秒 * @param int $one_time 时间一 * @param int $two_time 时间二 * @param int $r ...

  8. matplotlib坐标轴刻度-【老鱼学matplotlib】

    本节主要讲述如何对坐标轴的刻度字体大小以及背景色进行修改. 例如: import numpy as np import pandas as pd import matplotlib.pyplot as ...

  9. Python实现字符串反转的几种方法

    面试遇到的一个特无聊的问题--- 要求:在Python环境下用尽可能多的方法反转字符串,例如将s = "abcdef"反转成 "fedcba" 第一种:使用字符 ...

  10. 多线程下载图片,同步下载http://www.importnew.com/15731.html

    package mutiDownload; import java.io.IOException; import java.io.InputStream; import java.io.RandomA ...