学校练习,简单的我就不放上来了,值得整理的,我保存一下

习题4

1.1.验证元素唯一性(二重循环)

 

1.1.1.算法描述

验证元素唯一性,主要方法是:建立两重循环,进行校验每个元素和其他元素的

1.1.2.伪代码

 

UniqueElements(A[0..m-1])

//验证给定数组中的元素是否唯一

//输入:数组A[0..n-1]

//输出:如果A中元素全部唯一,返回true

//否则返回false

for i<- 0 to n-2 do

for j<- i+1 to n-1 do

if A[i]=a[j] return false

return true

1.1.3.算法实现

bool UniqueElements(int ele[],int len){

for(int i=0;i<len-1;i++)

for(int j=i+1;j<len;j++)

if(ele[i]==ele[j]) return false;

return true;

}

2.1.算法优化(quick sort 优化)

 

2.1.1.算法描述

使用quick sort排序算法进行优化,主要方法是:使用quick sort算法,进行元素排序,再取第一个值。

2.1.2验证元素唯一性(quick sort优化,伪代码)

UniqueElements(A[0..m-1]

//验证给定数组中元素是否唯一

//输入:数组A[0..n-1]

//输出:如果A中元素全部唯一,返回true

//否则返回false

qsort(A)

for i<-0 to len-1 do

if A[i]=a[i+1] return false

return true

2.1.3改进算法实现

int cmp(const void *a,const void *b){

return *(int*)b-*(int*)a;

}

bool UniqueElements(int ele[],int len){

qsort(ele,len,sizeof(int),cmp);//这个qsort是<stdlib.h>中自带的函数

for(int i=0;i<len-1;i++)

if(ele[i]==ele[i+1]) return false;

return true;

}

3.1.快排算法(quick sort)

3.1.1.算法描述

快排算法,是对冒泡排序的一种改进,在其中,有着分冶的思想。我们取一个base,之后进行左右递归排序。在排序过程中,我们从右往左,找到刚好比base小的数字,将右值赋给左值,然后从左往右,找到刚好比base大的数字,将左值给右值,最后两值相等,我们将base给左值。

3.1.2.伪代码

get_base(ele[0,m-1],left,right)

//获取划分的目标

//输入:一个元素,给定一个左值右值作为区间

//输出:返回划分的索引

base<-ele[left]

while left<right do

while left<right and ele[right] >= base do

right--

end

while left<right and ele[left] <= base do

left++

end

ele[left]=base

end

return left;

quick_sort(ele[0,m-1],left,right)

//进行递归排序

//输入:一个元素,给定一个左值右值作为区间

if left<right do

index<-getbase(ele,left,right)

quick_sort(ele,left,right)

quick_sort(ele,left,right)

end

3.1.3.实现

int get_base(int ele[],int left,int right){

int base=ele[left];

while(left<right){

while(left<right && ele[right]>=base) right--;

ele[left]=ele[right];

while(left<right && ele[right]<=base) left++;

ele[right]=ele[left];

}

ele[left]=base;

return left;

}

void quick_sort(int ele[],int left,int right){

if(left<right){

int index=get_base(ele,left,right);

quick_sort(ele,0,index-1);

quick_sort(ele,index+1,right);

}

}

4.1.试验小结

在验证元素唯一性的时候,我们通常的做法是,进行两重循环,进行两两相比较,如果两两相同,则返回false,否则返回true,这种算法,时间复杂度为O(n^2),空间复杂度为O(1),所以我们想到了优化方案,使用快排,进行优化,之后依次进行遍历,即可得到。我们思考一下,在使用快排,我们的时间复杂度为O(nlogn),空间复杂度为O(1)。这个效率明显比之前的效率优化了太多。

快排算法中,我们可以使用C语言<stdlib.h>中自带的qsort函数,这个函数的原型如下,void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );第一个buf,指的是你的数组,第二个参数size_t指的是一个无符号整型,为你的数组长度,第三个参数为你的数组元素大小,第四个参数为一个void指针,我们在C程序的学习中,知道了,void指针可以指向任意,也可以被任意所指向,所以,我们在定义比较函数cmp的时候,要注意,定义的是const void*的参数类型,之后再强转为元素指针类型,进行比较,这样做,能直接将快排算法,适用于整个C程序中任意排序。

在手写快速排序的时候,我们要注意一点,关于左右值的移动,应该先移动右值,赋值给左,然后再移动左,赋值给右,最后,返回左下标,作为划分点。

我们在了解划分的时候,不能够忘记一个思想,分冶的思想,这个思想在我们今后会经常能够用得到。

转载于:https://www.cnblogs.com/littlepage/p/11515537.html

验证元素的唯一性(二重循环法和快排优化)相关推荐

  1. 算法基础:快排优化:为什么快排都会TLE

    在算法训练中,快排应该是基础中的基础了,直接使用前面介绍的快排,无论是单向循环还是双向循环方式,在特定的数据序列下,都有可能出现TLE(Time Limit Exceeded)超时,这篇文章对原因和基 ...

  2. c++ 快排优化(三数取中法)

    快排优化(三数取中法) 文章目录 快排优化(三数取中法) 前言 一.三数取中法 二.递归思想 三.程序实现过程(代码) 1.取基准数(三数取中) 2.快速排序(递归) 总结 前言 作为刚刚入门c和c+ ...

  3. 快排三种基本解法以及两种快排优化

    /*  快速排序  基本思想    选定每次排序的基准数据 在剩下的位置将小于基准值的数据放在基准值得左边,大于基准值的数据放到基准值的右边    一次划分之后 如果此基准值的左右两边仍存在大于两个数 ...

  4. 快排优化Python表示

    基本快速排序分析 以从小到大排序为例 * 选取一个主元(选取方式多样) * 利用主元,将序列分为两个子序列,左侧都比主元小,右侧都比主元大. * 对两个子序列重复此操作 例如取第一个元素,代码表示如下 ...

  5. 七天快排优化真的存在!

    在当下的互联网中经常会看到一些网站优化公司推出的网站快排系统,关键词超快上首页.不过,我们今天要说的是,这样的黑帽行为是真的存在. 1. 借用高权重老网站 在行业相关的高权重网站中修改tdk借力实现快 ...

  6. 快速提升网站排名_使用快排优化的方法

    确定自己网站适不适合做快排 好多小伙伴想为自己网站做一做快排,但是又不知道自己网站适不适合,首先,大家都知道选好关键词的重要性,想实现投入和产出的最大化,建设网站前选好合适的关键词是非常必要的.找到网 ...

  7. 快排优化代码__2018.07.26

    代码: ======4.快速排序优化============== int Partion(int *arr,int low,int high) {int tmp = arr[low]; while(l ...

  8. 12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?

    算法对比: 算法 时间复杂度 适合场景 冒泡排序.插入排序.选择排序 O(n2) 小规模数据 归并排序.快速排序 O(nlogn) 大规模数据 归并排序和快速排序都用到了分治思想,非常巧妙.我们可以借 ...

  9. 【LeetCode笔记】215. 数组中的第K个最大元素(Java、快排、堆排、并发快排)

    文章目录 题目描述 思路 & 代码 快排 基于 Fork / Join 的并发快排 针对 topK 的快排优化 堆排 基本堆排 结合题目的堆排 二刷 题目描述 大名鼎鼎的TOP K,主要考察排 ...

最新文章

  1. 【Java代码】道格拉斯-普克 Douglas-Peucker 抽稀算法分析及15w个坐标点抽稀到3.7w耗时从360s+优化到365ms接近1000倍的速度提升源码分享(并行流+多线程+泛型)
  2. c# params 工作原理。
  3. ADBannerView 的基本使用方法
  4. Pure Pursuit纯跟踪算法Python/Matlab算法实现
  5. 抖音店播 就是我们说的商家自播品牌自播
  6. 使用xml和java代码混合控制UI界面
  7. Fastreport.Net用户手册(九):配置Bands
  8. 华为hg255d路由器使用博爱网络开发的操作系统进行中继设置
  9. Android中的GalleryView实例演示-周末福利有美女图
  10. uni-app开始时间结束时间(结束时间大于开始时间)picker编写
  11. impdp导入的时候报错,ORA-06502,LPX-00230
  12. 让你的程序陪你的好友打会牌吧(零)
  13. Linux上音频转换工具mpg123
  14. Office宏病毒Virus.MSExcel.Agent.f的查杀方法
  15. tensorflow sess.run()
  16. i7运行linux虚拟机会卡吗,i7 7200 linux 虚拟机
  17. 【XSY2485】MST(最小生成树+倍增lca+并查集)
  18. joinus计算机怎么弄游戏,美国us计算机专业学校排名:joinus学生计算机如何消除sci...
  19. vs2017打包所有文件到一个.exe或.msi 默认安装位置,加入桌面与菜单快捷方式
  20. 腾达远端服务器无响应原因,腾达路由器连接后网速很慢原因分析

热门文章

  1. scratch字母点头问好 电子学会图形化编程scratch等级考试一级真题和答案2020-9
  2. php 公众号 群发,微信公众号【服务号】群发策略调整,并开通高级群发接口
  3. 兵法三十六计第三计-借刀杀人。
  4. 防火墙——GRE隧道讲解
  5. ActiveMQ 无法启动 提示端口被占用,永远无法杀掉进程
  6. 怎么用python画螺旋_用Python tu绘制螺旋
  7. FPGA数字信号处理(十八)Quartus CIC IP核实现
  8. 查询近12个月的数据,没有数据的月份补零
  9. 国产自主内存产能发展迅猛
  10. 解决 Cannot resolve symbol ‘XXXxxx‘问题