快速排序&基数排序
//快速排序
#include<stdio.h> void QuickSort(int R[],int low,int high)
{
int i=low,j=high;
int pivot;
if(low<high)
{
pivot=R[i];
while(i!=j)
{
while(i!=j && R[j]>pivot)
j--;
R[i]=R[j];
while(i!=j && R[i]<pivot)
i++;
R[j]=R[i];
}
R[i]=pivot;
QuickSort(R,low,i-);
QuickSort(R,j+,high);
} } int main()
{
int a[]={,,,,,,,,,};
int i;
printf("原 :");
for(i=;i<;i++)
printf("%d ",a[i]);
printf("\n排序后:");
QuickSort(a,,);
for(i=;i<;i++)
printf("%d ",a[i]);
return ;
}
//快速排序中用到递归,递归实质是一个循环
/*
while(条件) //条件=递归出口
{
function(变化的参数);
}
*/
//递归的思想是异级同构

//基数排序
#include<stdio.h>
// 乾卦
// 2014-5-3
//获取数字的十位数
int get_ten(int n)
{
return(n/); }
//获取数字的个位数
int get_single(int n)
{
return (n%);
}
int main()
{
int arr[][]={}; //存储索引,相同的数字最大存10个
int ind_arr[]={}; //每行的存储长度
int R[]={,,,,,,,,,};
int i,j,index;
int k;
//按个位数排序
for(i=;i<;i++)
{
index=get_single(R[i]); //获取每个数字的个位数
arr[index][ind_arr[index]]=i; //存储在R中的索引
ind_arr[index]++;
}
//我们看看按照个位数排序后的输出
printf("按照个位数排序:\n");
for(i=;i<;i++)
{
for(j=;j<ind_arr[i];j++) //先输出行
{
printf("%d ",R[arr[i][j]]);
}
}
printf("\n");
//遍历,整个数组然后从十位数最小的开始输出
for(i=;i<;i++) //遍历10次
{
for(j=;j<;j++)
{
for(k=;k<ind_arr[j];k++)
{
if(i==get_ten(R[arr[j][k]]))
printf("%d ",R[arr[j][k]]); } } }
return ;
}

可以用图表示上面的排序,跟前几篇的桶排序有相似的地方:

最上层的是arr数组的列索引,最左侧是arr数组的行索引,最右侧的是每行存储了多少个数,也就是ind_arr的值。
有黑色边框的表格里面的值的x:xx ,x代表数组R中的索引值,xx则是R[x]。
然后我们从头开始按顺序遍历10次(说遍历有点牵强,应该说遍历arr数组内值不为0的),
每次取十位数值与遍历号相同的值输出。
此方法效率巨低。
那么我们可以考虑用空间换时间的方法。
//遍历,整个数组然后从十位数最小的开始输出
for(j=;j<;j++)
{
for(k=;k<ind_arr[j];k++)
{
//一共10个队列queue[x]
queue[get_ten(R[arr[j][k]])].enQueue(R[arr[j][k]]); }
}
我们一开始就可以用到这10个队列。很多书上有,不在此赘述。
快速排序&基数排序的更多相关文章
- 学习笔记三:基础篇Linux基础
Linux基础 直接选择排序>快速排序>基数排序>归并排序 >堆排序>Shell排序>冒泡排序=冒泡排序2 =直接插入排序 一.Linux磁盘分区表示 Linux中 ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
- swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,swift基数排序
import UIKit /// 冒泡 /// ///时O(n2),空O(1) 稳定排序 func Mysort(arr:[Int]) -> [Int]{ var transArr = arr ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)
目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...
- 9, java数据结构和算法: 直接插入排序, 希尔排序, 简单选择排序, 堆排序, 冒泡排序,快速排序, 归并排序, 基数排序的分析和代码实现
内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { publi ...
- 算法与数据结构(十六) 快速排序(Swift 3.0版)
上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...
- 基数排序 java 实现
基数排序 java 实现 Wikipedia: Radix sort geeksforgeeks: Radix sort 数学之美番外篇:快排为什么那样快 Java排序算法总结(八):基数排序 排序八 ...
随机推荐
- redisTemplate注入为空
springboot2.*集成redis时,redis工具类中的redisTemplate注入后总是为空. 问题代码还原: 1.工具类定义成静态工具类,@Resource注入redisTemplate ...
- DNS原理和智能DNS及CDN
CDN是什么 CDN(Content Delivery Network)是内容分发网络. 作用: 使用户可以就近取的所需要的内容,加速用户访问网站资源的速度.物理距离更近,响应速度更快.拦截部分网络请 ...
- NOIP2016天天爱跑步解题思路
算法:LCA,树上差分+(乱搞) 如果有写错的地方请大佬更正 对于100%数据: u表示起点,v表示终点 对于一条u到v的路径,先讨论LCA!=u&&LCA!=v的情况: 分为u到LC ...
- 128-PHP类继承extends
<?php class father{ //定义father类 //定义public描述的成员属性和方法 public $eyes=2; public $ears=2; public funct ...
- Flink Window窗口机制
总览 Window 是flink处理无限流的核心,Windows将流拆分为有限大小的"桶",我们可以在其上应用计算. Flink 认为 Batch 是 Streaming 的一个特 ...
- Oozie笔记
简介 Oozie 是用于 Hadoop 平台的开源的工作流调度引擎. 用于管理 Hadoop 属于web应用程序, 由 Oozie client 和 Oozie Server 两个组件构成. Oozi ...
- 配置mysql时报错
配置mysql时无法启动此程序,因为计算机丢失MSVCR100.dll. 去https://cn.dll-files.com/下载相应的版本 复制MSVCR100.dll 粘贴到下面 32位系统: 复 ...
- python+selenium 发送邮件
import time from selenium import webdriver from selenium.webdriver import ChromeOptions from seleniu ...
- linux系统pid的最大值研究
内核源码探查 通过对linux内核源码的追踪,可以看到对pid最大值的限定最终集中到include/linux/threads.h文件中的PID_MAX_DEFAULT上了,代码如下: /* * Th ...
- VM虚拟机安装 常用Linux命令 网卡配置 (第二天)
VM虚拟机安装:(昨天已经安装好了VM了,按照提示安装就好,很简单) 1.安装centos7虚拟机,现在磁盘里面新建文件夹作为安装文件夹 2.找到centos7的iso文件,打开vm-新建虚拟机-按照 ...