一:快速排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/timeb.h>#define MAX 10//获取时间,毫秒
long getTime()
{struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm;
}//打印
void PrintArr(int* arr, int len)
{for (int i = 0; i < len; i++){printf("%d ", arr[i]);}
}//快速排序
void Quick_Sort(int arr[],int start,int end)
{int i = start;int j = end;int temp = arr[start];//temp是基数,默认从0位开始if (j>i){//第一次循环while (j>i){//如原始数据:4 2 8 0//第一个基数为4,变为: ' ' 2 8 0  i指向空格,j指向0if ((arr[j]>=temp))//注意i和j其中一个或者共同 必须有等于情况{//如若j指向的0是9,比4大,j往前走j--;}//J指向的比4小,交换位置 i 填空//0 2 8 ' ';arr[i] = arr[j];//i指向的数如若比4小,如0,则i++if ((arr[j] <= temp)){//如若j指向的0是9,比4大,j往前走i++;}//i指向的数如若比4大,如8,则填空//0 2 ' ' 8arr[j] = arr[i];}//第一轮循环结束后, i和j同时指向空格' ' 把temp填上//0 2 4 8arr[i] = temp;//分治开始,左右各开始 回调Quick_Sort(arr, start, i - 1);//左边 i指向0 j指向2Quick_Sort(arr, i + 1, end);}
}int main(void)
{srand((unsigned int)time(NULL));int arr[MAX];for (int i = 0; i < MAX;i++){arr[i] = rand() % MAX;}int len = sizeof(arr) / sizeof(arr[0]);printf("快速排序前:");PrintArr(arr, MAX);//printf("%d\n", len);long t_start = getTime();Quick_Sort(arr,0,len-1);long t_end = getTime();printf("\n");printf("快速排序后:");PrintArr(arr, MAX);printf("\n");printf("快速排序共花费%ld毫秒\n", t_end - t_start);return 0;
}

二:堆排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define MAX 10
/** 数组就相当于满二叉树*///打印
void PrintArr(int* arr, int len)
{for (int i = 0; i < len; i++){printf("%d ", arr[i]);}printf("\n");
}//交换
void MySwap(int *arr,int index,int max)
{int temp = arr[index];arr[index] = arr[max];arr[max] = temp;
}//开始调整 index为调整的开始位置 初始化时为0 下标为3
void HeapJust(int *arr,int index,int len)
{int max = index;int lChild = index * 2 + 1;//3int rChild = index * 2 + 2;//9if (lChild<len && (arr[lChild]>arr[max])){//lChild<len 如果0没有左右子树,len=6 上面lChild=7 为空则不执行max = lChild;//3>0}if (rChild<len && (arr[rChild]>arr[max])){//lChild<len 如果0没有左右子树,len=6 上面lChild=7 为空则不执行max = rChild;//9>3}//考虑树根8 左右7 1  index=max就不用交换if (index!=max){MySwap(arr, index, max);//交换以后,需要考虑后面的也要交换HeapJust(arr, max, len);}
}void HeapSort(int *arr,int len)
{//1.初始化 将最大数调到顶端 从下往上调//默认起始位置为倒数第二排 下标为3的位置for (int i = len / 2 - 1; i >= 0;i--)//i--后到下标为2的位置 也就是8{//开始调整HeapJust(arr, i,len);}//2.将顶端依次和底部调整位置,从头开始调整排序for (int i = len - 1; i >= 0;i--){MySwap(arr, 0, i);//开始为0和9交换//从头开始调整HeapJust(arr, 0, i);//树顶和树尾交换了几次,最大几个数就已经放在尾部了,len为i}
}
int main(void)
{//int arr[] = { 4, 2, 8, 0, 5, 7, 1, 3, 9 };srand((unsigned int)time(NULL));int arr[MAX];for (int i = 0; i < MAX; i++){arr[i] = rand() % MAX;}int len = sizeof(arr) / sizeof(arr[0]);PrintArr(arr, len);//printf("%d", len);HeapSort(arr, len);PrintArr(arr, len);return 0;
}

数据结构二:排序(快速排序和堆排序)相关推荐

  1. 浅谈数据结构-选择排序(简单、堆排序)

    选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止. 选择排序正如定义所讲,在数组查询出最小值,然后放在此次循环开始位置(前一次循环已经获取比它更小 ...

  2. 数据结构之排序算法(一)-堆排序

    继上篇文章讲到堆的实现之后http://blog.csdn.net/tuke_tuke/article/details/50357939,下面可以使用堆来实现堆排序. 在堆的基础上实现堆排序的思路很简 ...

  3. 数据结构:排序算法之堆排序和选择排序

    1.堆排序 void HeapAdjust(int array[], int root, int size) {int parent = root;int child = root*2 + 1;whi ...

  4. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  5. 常见排序算法原理及实现——第二部分(归并排序、快速排序、堆排序)

    引言 排序算法第一部分,我们聊了冒泡排序.插入排序.选择排序这三种排序算法,它们的时间复杂度比较高,都是 O(n2),适合小规模数据的排序.今天,我们来看三种时间复杂度为 O(nlogn) 的排序算法 ...

  6. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  7. 四种常见排序算法的对比和总结 插入排序、归并排序、快速排序、堆排序

    目录 一.排序算法的时间复杂度 二.排序算法是否是原地排序 三.排序算法的额外空间 四.排序算法的稳定性 Stable 五.总结 这里我们要总结的排序算法主要有4个,分别是插入排序Insertion ...

  8. 数据结构-选择排序(简单选择排序,堆排序)

    目录 1,简单选择排序 1.1,简单选择排序思想 1.2,选择排序的时间复杂度分析 1.3,简单选择排序代码实现 2,堆排序 2.1,什么是堆排序 2.2,堆排序的思想 2.3,堆排序时间复杂度分析 ...

  9. 数据结构---二叉平衡排序树的删除

    数据结构-二叉平衡排序树的删除 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlT ...

  10. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

最新文章

  1. 腾讯云存储产品矩阵全面升级,发布三维生态战略
  2. 第十六届智能车竞赛 | 单车拉力组浅析
  3. UIView的飞入效果
  4. Nessus更新到8.5.0
  5. 1个ieee1394端口_如何使用圆形端口进行波导激励和终止
  6. 【算法与数据结构】最大子序列和问题
  7. [小技巧]你真的了解C#中的Math.Round么?
  8. vert.x_使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务
  9. Codis的源码编译生成tar包
  10. java web spark_spark-微型的Java Web框架 Spark Framework
  11. Codeforces Round #372 (Div. 1) B. Complete The Graph
  12. 4.4 VGG CNN、tensorflow实现——python实战
  13. FlashCC导入使用greensock(TweenLite)包
  14. 数二计算机考研大纲2016,2016数二考研大纲.doc
  15. 将图片转化成RGB格式
  16. 飞鸽传书2007绿色版该消息称
  17. jenkins+svn+脚本实现CIDI
  18. 16. Segmentation
  19. Linux gpio 接口
  20. MAC上安装Ubantu双系统

热门文章

  1. JZOJ__Day 7:【普及模拟】蚂蚁
  2. 宇宙总统pascal程序
  3. android 新浪微博的点赞功能实现,Android PraiseTextView实现朋友圈点赞功能
  4. 20211108 det(AB)=det(A)det(B)
  5. 企业项目开发--企业中的项目架构以及多环境分配(2)
  6. 【原创】面向对象作业:选课系统中用pickle储存多个对象间组合引用关系的那些坑...
  7. SQL事务用法begin tran,commit tran和rollback tran的用法
  8. 【PHP】__autoload()魔术方法与spl_autoload_register
  9. chrome console 调试xpath
  10. 2015生命之旅---第一站重庆