简易的选择排序与快速排序
选择排序的思路非常简单,就是依次从头到尾挑选合适的元素放到前面。如果总共有n个节点,那么选择一个合适的节点需要比较n次,而总共要选择n次,因此总的时间复杂度是O(n2)。
选择排序的思路是,假设有一个数组:3 2 5 1 7
假设第一个数为最小值和后续的数字进行比较,如 3>2 ,此时min的值=2,让2继续进行比较,
当2>1,这时min=1,当for结循环束,没有比1更小的数时,使用一个for循环找到最小值的坐标如这个数组中 1 的下标为 3 (数组的下标从0 开始),设置一个中间变量d,第一次选择排序就是
a[0]=3,min=1;
d=a[0];
a[0]=min;
a[3]=d;交换数值后,a[0]=1,a[3]=3
则第一次选择排序后 数组:1 2 5 3 7。后续以此类推,将a[0],a[1]......慢慢选择到合适的位置
void sort(int a[],int len)
{int min,d,k=0;for(int i=0;i<len-1;i++){ min=a[i]; //假设a[i]为最少值for(int j=i+1;j<len;j++){if(min>a[j]) //判断后续的数字若是小于min{min=a[j]; //将a[j]设置为最低值,继续进行排序k++; } }if(k!=0) //判断是否进行了交换数值{for(int m=1;m<len;m++){if(a[m]==min) //寻找最小值的坐标,进行交换{d=a[i];a[i]=min;a[m]=d;}} }k=0;}
代码演示效果如下:
代码如下:有需要的小伙伴可以参考(可以根据题目条件进行修改代码)
#include<stdio.h>void sort(int a[],int len)
{int min,d,k=0;for(int i=0;i<len-1;i++){ min=a[i]; //假设a[i]为最少值for(int j=i+1;j<len;j++){if(min>a[j]) //判断后续的数字若是小于min{min=a[j]; //将a[j]设置为最低值,继续进行排序k++; } }if(k!=0) //判断是否进行了交换数值{for(int m=1;m<len;m++){if(a[m]==min) //寻找最小值的坐标,进行交换{d=a[i];a[i]=min;a[m]=d;}} }k=0;}printf("排序后的数组:");for(int i=0;i<len;i++){printf("%d\t\t",a[i]);}}int main()
{ int j,a[5]={0};int len=sizeof(a)/sizeof(int); printf("请输入任意的5个数:\n");for(int j=0;j<5;j++){scanf("%d",&a[j]);}printf("排序前的数组:");for(int j=0;j<5;j++){printf("%d\t\t",a[j]);}printf("\n");sort(a,len);
}
快速排序
快排是一种递归思想的排序算法,先比较其他的排序算法,它需要更多内存空间,但快排的语句频度是最低的,理论上时间效率是最高的。
快速排序的核心点就是找到一个支点如上图所示。
核心代码如下我带大家一步步看,假设现有一个7个数的数组:54 3 95 14 67 9 20
从注释快速排序中开始看,将数组和长度传入partion,定义i和j将数组中的第一位和最后一位标记出
54 3 95 14 67 9 20
i j 开始判断右边是否小于左边,如果小于退出,并且交换数值。
第一次交换后数组成 20 3 95 14 67 9 54 开始第二次判断
i j
第二次交换后数组 20 3 54 14 67 9 95 返回 i 的值 i=2
i j
返回后再次进行函数,不过这次的数组长度为2,数组 20 3 交换后 数组 3 20
在进行一次函数,函数从arr[3]开始,数组长度为4,数组 14 67 9 95
i j
交换后的数组 9 67 14 95
i j
交换 9 14 67 95
i j
第一次快速排序后,数组 3 20 54 9 14 67 95,第一次快速排序后数组并非出现规律状
第二次快快速排序后,数组 3 14 20 9 54 67 95,第二次快速排序中出现支点54
快速排序理解起来比较麻烦,但快速排序是常用的排序方法,可以用草稿纸慢慢理解。
int partion(int *arr, int len)
{int i, j;if(len <= 1)return 0;i = 0;j = len-1;while(i < j){//找到右边小于左边值,则退出while( arr[i] < arr[j] && i < j) //只要右边比左边大,j可以向左移动{j--;}swap(&arr[i], &arr[j]);//找到左边大于右边值,则退出while( arr[i] <= arr[j] && i < j) //只要右边比左边大,i可以向右移动{i++; } swap(&arr[i], &arr[j]);}//返回支点return i;
}//快速排序
void quicksort(int *arr,int len)
{if(len <= 1)return;int pivot = partion(arr, len);// display(arr, len);quicksort(arr, pivot);quicksort(arr+pivot+1, len-pivot-1);} void swap(int *a, int *b)
{int tmp;tmp = *a;*a = *b;*b = tmp;
}
代码演示效果如下:
代码如下:
#include <stdio.h>//快速排序
void quicksort(int *p,int len);//交换数值
void swap(int *a, int *b);//输出数组
void display(int *arr, int len);int main(void)
{int i, len;int arr[7];len = sizeof(arr)/sizeof(int);printf("请输入7个整数:\n");for(i=0; i<7; i++){scanf("%d", &arr[i]);}printf("排序前数据:\n");display(arr, len);quicksort(arr, len);printf("排序后数据:\n");display(arr, len);
}int partion(int *arr, int len)
{int i, j;if(len <= 1)return 0;i = 0;j = len-1;while(i < j){//找到右边小于左边值,则退出while( arr[i] < arr[j] && i < j) //只要右边比左边大,j可以向左移动{j--;}swap(&arr[i], &arr[j]);//找到左边大于右边值,则退出while( arr[i] <= arr[j] && i < j) //只要右边比左边大,i可以向右移动{i++; } swap(&arr[i], &arr[j]);}//返回支点return i;
}//快速排序
void quicksort(int *arr,int len)
{if(len <= 1)return;int pivot = partion(arr, len);// display(arr, len);quicksort(arr, pivot);quicksort(arr+pivot+1, len-pivot-1);} void swap(int *a, int *b)
{int tmp;tmp = *a;*a = *b;*b = tmp;
}//输出数组
void display(int *arr, int len)
{int i;for(i=0; i<len; i++){printf("%d\t", arr[i]);} printf("\n");
}
简易的选择排序与快速排序相关推荐
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...
掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...
- iOS swift 选择排序 冒泡排序 快速排序
返回上级目录:iOS 算法题 三大经典排序 | 冒泡排序,选择排序,快速排序 - 知乎 文章目录 1.选择排序 2.冒泡排序 3.快速排序 1.选择排序 //选择排序 func rankSelect( ...
- 【C语言冒泡排序、选择排序和快速排序】
文章目录 前言 一.冒泡排序 二.选择排序 三. 快速排序 四.代码设计与实现 代码设计 代码实现 调试结果 冒泡排序改良 延伸思考 总结 前言 本文简单介绍了C语言的冒泡排序.选择排序.快速排序,结 ...
- 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。
题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- JS-排序详解:冒泡排序、选择排序和快速排序
JS-排序详解-冒泡排序 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在 ...
- 插入排序、选择排序、快速排序以及归并排序(附Python代码)
排序算法基本原理以及复杂度等知识点可跳转至该博客了解https://www.cnblogs.com/onepixel/p/7674659.html ,本博客主要对排序算法性能进行对比以及记录对比过程发 ...
- python3写冒泡排序_使用python3实现冒泡排序、选择排序和快速排序
冒泡排序的时间复杂度是O(n^2),选择排序的时间复杂度也是O(n^2),这是因为这两种排序算法的元素比较次数是相同的.但因为冒泡排序是每比较一次,就会交换一次,而选择排序是每一轮循环结束后才进行一次 ...
最新文章
- 英语发音规则---N字母
- linux 设备管理工具 udev 规则编写
- 魔方机器人需要特制魔方吗_解魔方的机器人攻略18 – 魔方快速算法
- Graphviz:利用可视化工具Graphviz将dot数据进行图像可视化或者图像保存(两大方法)之详细攻略
- windows server 2012 磁盘整理功能 试用 chkdsk
- centos 安装Jitsi架设_Docker学习6:docker安装centos7
- ------webkitformboundary
- java Int数据工具类
- 已知二叉树先序和中序,求后序。
- VB 注册ocx控件的方法
- iphone双重认证关闭不了怎么办_苹果手机双重认证怎么关闭-互盾苹果恢复精灵...
- 【制作】基于金沙滩51单片机的电子跑表
- 个人网站、公众号申请微信个人支付接口
- 速看四川省企业技术中心拟认定名单已发布,共181家
- 这样的生产计划与排产,我看行
- Class6 基于ECS和NAS搭建个人网盘
- 今日睡眠质量记录79
- 统计学原理----算术平均数和调和平均数
- 全国青少年软件编程等级考试Python标准解读(1_6级)
- hexo butterfly主题添加备案信息
热门文章
- docker安装nginx1.20.2并配置nginx.conf
- 职场新人想要快速成长?这些excel技巧需要懂!
- 思维导图软件哪个好?安利八款好用的思维导图软件
- 主从数据库部署(centos7)
- 万信金融项目学习笔记
- 互联网企业安全高级指南读书笔记之安全管理体系
- 图片怎么压缩到200k以内?图片压缩怎么指定大小?
- Hadoop搭建、环境配置
- 小学成绩统计软件薪火数据,是一款帮班主任老师轻松搞定成绩统计的软件,它不仅能对学生的成绩进行统计,还能把成绩进行分析打印,让老师们轻松直观的看到学生成绩的情况。
- GUI 图形用户界面编程(八)选择界面-当女友穿上女仆装,你是选择接着改bug还是要去......