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

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

习题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

时间: 2024-07-30 03:30:16

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

俩头查找的快排优化

对于 5743 经典快排过程: 5473 5437 会造成多次替换,所以写出优化算法: 去第一位为基准值 从左向右扫 发现大值 从右向左扫 发现小值 替换 将基准值和最后一个小值替换 function quick(arr, start, end) {     if (start >= end-1) {         return;     }     var mini = start;     var maxi = end;     var split = arr[start];     wh

排序详解(希尔,快排,归并等)

今天集中把几种排序的方法列一下,当然最出名的希尔,快排,归并和其优化当然也是满载 说到希尔排序的话,不得不先提到的就是插入排序了,希尔排序就是对直接插入排序的一种优化,下面就是直接插入排序的思想 1 void InsertSort(int *a, size_t size) 2 { 3 assert(a); 4 for (int i = 1; i < size; ++i) 5 { 6 int index = i; 7 int tmp = a[index]; 8 int end = index -

淘宝等seo广告里面所讲的三天上首页的快排技术大揭秘

淘宝等seo广告里面所讲的三天上首页的快排技术大揭秘 淘宝seo快排技术 今天,我在志在指尖群里面看了看,有人说做一个排名其实非常的简单(我去,简单?想做好seo这是何等漫长的一个事情,谈何简单)我们都知道,做好seo,不仅要做好站内,也要做好站外,不管是关键词布局,内链布局等,还是外链创设,在这是文章书写等,这都是需要很大耐心以及技术的.所以,我没打扰他,我就想听听他口中所谓seo'简单'二字是什么意思,结果意想不到,他就直说了四个字-淘宝快排-what fuck?这四个字让我笑得肚子疼(这里

第九章 二重循环

一.回顾3种循环结构 1.while l  语法 条件表达式的初始值: while(条件表达式){ 循环操作: 更改条件表达式的语句: } l  特点:先判断,再执行,有可能一次循环都没有 l  适用的场合:循环次数未知 l  表现形式 n  第一种:循环的次数确定 u  条件表达式,判断整型的变量在某个范围 u  while(i<=5){ //不需要接收用户输入} n  第二种:循环次数不限,用户输入某个值结束循环 u  条件表达式,根据用户输入的值进行判断 u  while(用户输入的值和某

20150805 Day07 数组,二重循环

数组: 1.打擂比较算法 if(num>max){ max=num; //没有break! } 2.数组排序 sun公司并没有提供一个方法专门用于降序排列,但是我们可以转换一下思路,先对数组中元素进行升序排列,然后降序输出数组中元素. 3.在我们自己的类中,可以对多个系统类进行导入使用.例如可同时使用Arrays和Scanner 二重循环: 1.直角三角形 * ** *** **** ***** *号(j)          行号(i) 1                 1 2        

二重循环解题思路

本文通过一道习题,讲解做二重循环习题的思路: 题目:使用二重循环打印如下图形: 分析:首先要明确我们需要打印的种类有:字符串"*",字符串"  "(空格).比如第一行,先打印了4个空格"  ",然后打印了一个"*" . 我们分析一下每行的具体打印情况: 第0行:先打印4个空格,然后打印1个"*" 第1行:先打印3个空格,然后打印3个"*" 第2行:先打印2个空格,然后打印5个"

二重循环解题思路--颜群

本文通过一道习题,讲解做二重循环习题的思路: 题目:使用二重循环打印如下图形: 分析:首先要明确我们需要打印的种类有:字符串"*",字符串"  "(空格).比如第一行,先打印了4个空格"  ",然后打印了一个"*" . 我们分析一下每行的具体打印情况: 第0行:先打印4个空格,然后打印1个"*" 第1行:先打印3个空格,然后打印3个"*" 第2行:先打印2个空格,然后打印5个"

普林斯顿大学算法课 Algorithm Part I Week 3 重复元素排序 - 三路快排 Duplicate Keys

很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路快排就没有这样的问题. 归并排序对重复数据排序的比较在1/2NlgN和NlgN之间 三路快排 目标:将数据分成三个区间(3-way partitioning) lt和gt区间内的元素都和比较元素v相等 lt左边的元素都比v小 gt右边的元素都比v大 性能 三路快排的复杂度比普通快排小,主要取决于数据

《java入门第一季》之HashSet存储元素保证唯一性的代码及图解

上一篇介绍了HashSet存储自定义自定义对象时应该注意的问题http://blog.csdn.net/qq_32059827/article/details/51580642, 这一篇对其内部结构稍作了解.用一张图,宏观认识,HashSet存储元素保证唯一性的原理: 其实HashSet的代码直接自动生成,这里也是了解即可.