用二分法排序算法可以实现什么任务? 查找?排序?求和?查找和排序?哪个。

1.插入排序
每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止。
[初始关键字] [49] 38 65 97 76 13 27 49
J=2(38) [38 49] 65 97 76 13 27 49
J=3(65) [38 49 65] 97 76 13 27 49
J=4(97) [38 49 65 97] 76 13 27 49
J=5(76) [38 49 65 76 97] 13 27 49
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27 38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]
时间复杂度:
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上&(n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
//插入排序
function insertSort($arr){
$count=count($arr);
for($i=1;$i&$$i++){
$tem=$arr[$i];
while ($arr[$j]&$tem){
$arr[$j+1]=$arr[$j];
$arr[$j]=$
2.选择排序
思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
[初始关键字] [49 38 65 97 76 13 27 49]
第一趟排序后&13&[38 65 97 76 49 27 49]
第二趟排序后&13 27&[65 97 76 49 38 49]
第三趟排序后&13 27 38 [97 76 49 65 49]
第四趟排序后&13 27 38 49 [49 97 65 76]
第五趟排序后&13 27 38 49 49 [97 97 76]
第六趟排序后&13 27 38 49 49 76 [76 97]
第七趟排序后&13 27 38 49 49 76 76 [ 97]
最后排序结果&13 27 38 49 49 76 76 97
时间复杂度:
时间复杂度为o(n2),不稳定排序,适合规模比较小的
//选择排序
function selectSort($arr){
$count = count($arr);
for($i=0;$i&$count-1;$i++){
for($j=$i+1;$j&$$j++){
if($arr[$k]&$arr[$j])
$temp=$arr[$i];
$arr[$i]=$arr[$k];
$arr[$k]=$
3.冒泡排序
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
49 13 13 13 13 13 13 13&
38 49 27 27 27 27 27 27
65 38 49 38 38 38 38 38
97 65 38 49 49 49 49 49
76 97 65 49 49 49 49 49
13 76 97 65 65 65 65 65
27 27 76 97 76 76 76 76
49 49 49 76 97 97 97 97
时间复杂度:
该算法的时间复杂度为O(n2)。但是,当原始关键字序列已有序时,只进行一趟比较就结束,此时时间复杂度为O(n)。
//冒泡排序
function bubbleSort($arr){
$count = count($arr);
if ($count &= 0)
for($i=0;$i&count($arr);$i++){
$flag = & &//本趟排序开始前,交换标志应为假
for($j=count($arr)-1;$j&$i;$j--){
if($arr[$j-1]&$arr[$j]){
$temp=$arr[$j-1];
$arr[$j-1]=$arr[$j];
$arr[$j]=$
if(! $flag)//本趟排序未发生交换,提前终止算法
//return $
4.快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
时间复杂度:
快速排序主体算法时间运算量约&O(log2n)&,划分子区函数运算量约&O(n)&,所以总的时间复杂度为&O(nlog2n)&,它显然优于冒泡排序&O(n2).&可是算法的优势并不是绝对的。试分析,当原文件关键字有序时,快速排序时间复杂度是&O(n2),&这种情况下快速排序不快。而这种情况的冒泡排序是&O(n),&反而很快。在原文件记录关键字无序时的多种排序方法中,快速排序被认为是最好的一种排序方法。
//快速排序
function quickSort($arr){
if(count($arr)&=1)
$key=$arr[0];
$left_arr=array();
$right_arr=array();
for($i=1;$i&count($arr);$i++){
if($arr[$i]&=$key){
$left_arr[]=$arr[$i];
$right_arr[]=$arr[$i];
$left_arr=quickSort($left_arr);
$right_arr=quickSort($right_arr);
return array_merge($left_arr,array($key),$right_arr);
$arr=array(49,38,65,97,76,13,27,49);
print_r(quickSort($arr));
// 二分法查找
function binarysearch($arr, $value, $start = 0, $end = NULL) {
if($end == NULL) $end = count($arr) - 1;
$index = floor(($start+$end)/2);
$base = $arr[$index];
if($value & $base) return binarysearch($arr, $value, $start, $index-1);
else if($value & $base) return binarysearch($arr, $value, $index+1, $end);
else return $
$arr = array(1, 3, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20);
$value = 8;
echo binarysearch($arr, $value);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:141540次
积分:2427
积分:2427
排名:第9015名
原创:89篇
转载:78篇
评论:12条
阅读:4220
(1)(3)(1)(1)(10)(1)(2)(30)(1)(1)(1)(1)(1)(1)(3)(7)(8)(4)(5)(4)(23)(44)(14)求一段C代码
要求用快速排序后再用二分法查找_百度知道
求一段C代码
要求用快速排序后再用二分法查找
提问者采纳
int b[2][3];2;}void quicksort(char a[m]; n=strlen(a),n;
for(i=0;n&quot,a[i]),key-1);从右向左
直到查找到第一个小于key的数
if(i&*void quitsort()*&#47,b[m];&#47,若a[j]&%d \;n;
return 0; /low=0;;划分子函数 { char key=a[i]; puts(a);a[mid])
low=mid+1;#include&j&&a[i]&lt, &#47.h& quicksort(a; quicksort(a; }*&#47:&
while(low&*for(i=0;i++) {
a[i]=-1-i; } printf(&);/j)
&#47.h&i&lt,low,%c在数组a[%d]中&#92,p+1):&j&&a[j]&n&n&quot.h&=key)
/#include&lt,*(p)[3];=key)
i++;%x\/i& puts(&j)
a[j--]=a[i];/=top)
mid=(top+low)/ quicksort(a;),0; printf(& //1000,int j)
while(i&/ /i++)*/ top=n-1;*for(i=0;int main(){ char a[1000],n-1);a[mid])
top=mid-1;);;j)
/top) { key=partiton(a,*p+1),
a[i++]=a[j]; puts(& printf(&#include&*puts(a),top); printf(&quot,key+1; } a[i]=从 区间两端交替向中间依次查找
while(i&error,,int top){;%d\n&the list you input is,t!&
else if(b[0]& printf(&key表示
关键点在j上
j--,top);printf(&n&
while(i&lt,j.h&);),mid);i++)*&#47:&quot,i&printf(&
else if(b[0]&
printf(&th#define m 255int partiton(char a[m],a); p=b; } }int main(){ char a[m]; gets(b);please input the data that you select,strlen(a));
if(a[mid]==b[0])
printf(&quot,b[0]; int i#include& gets(a);&#47:&
/1000;;%s&%d\ if(low&lt
提问者评价
其他类似问题
为您推荐:
二分法查找的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁2387人阅读
c#程序设计(152)
&&& 二分法排序算法思想简单描述: 在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们 中间的那个元素比,如果小,则对前半再进行折半,否则对后半 进行折半,直到left&right,然后再把第i个元素前1位与目标位置之间 的所有元素后移,再把第i个元素放在目标位置上。
直接看代码。
public static void DichotomySort(int[] array)
for (int i = 0; i & array.L i++)
int start = 0;
int end = i - 1;
int middle = 0;
int temp = array[i];
while (start &= end)
middle = (start + end) / 2;
if (array[middle] & temp)//要排序元素在已经排过序的数组左边
end = middle - 1;
start = middle + 1;
for (int j = i - 1; j & j--)//找到了要插入的位置,然后将这个位置以后的所有元素向后移动
array[j + 1] = array[j];
array[end + 1] =
&&& 二分法查找。
&&& 查找思想:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
public static int DichotomySearch(int[] array, int key, int high, int low)
int middle = 0;
if (high & low)
return -1;
middle = (low + high) / 2;
if (array[middle] == key)
else if (array[middle] & key)
return DichotomySearch(array, key, middle - 1, low);
return DichotomySearch(array, key,high, middle + 1);
static void Main(string[] args)
int key=0;
Random random = new Random();
int[] array = new int[100];
for (int i = 0; i & 100; i++)
array[i] = random.Next(0,100);
key = array[i];
Dichotomy.DichotomySort(array);
for (int i = 0; i & array.L i++)
Console.Write(array[i] + &, &);
int index = Dichotomy.DichotomySearch(array, key, array.Length-1, 0);
Console.WriteLine();
Console.WriteLine(&查找{0},在array的位置{1}&, key, index);
Console.Read();
代码下载:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1111050次
积分:17491
积分:17491
排名:第277名
原创:382篇
转载:19篇
评论:434条
文章:31篇
阅读:72731
文章:27篇
阅读:35406
(2)(1)(5)(2)(2)(3)(5)(6)(1)(1)(5)(6)(5)(5)(5)(1)(6)(2)(3)(8)(7)(7)(7)(4)(11)(4)(5)(4)(7)(3)(5)(6)(8)(4)(4)(4)(7)(15)(6)(22)(31)(26)(16)(30)(35)(8)(24)(6)(9)(1)关于数据结构二分法查找成功的平均查找长度和失败的查找长度题目:已知一个有序表为(13 18 24 35 47 50 62 83 90 155 134)当用二分法查找算法进行元素搜索时,成功的平均查找长度和失败的平_百度作业帮
关于数据结构二分法查找成功的平均查找长度和失败的查找长度题目:已知一个有序表为(13 18 24 35 47 50 62 83 90 155 134)当用二分法查找算法进行元素搜索时,成功的平均查找长度和失败的平
关于数据结构二分法查找成功的平均查找长度和失败的查找长度题目:已知一个有序表为(13 18 24 35 47 50 62 83 90 155 134)当用二分法查找算法进行元素搜索时,成功的平均查找长度和失败的平均查找长度各为多少
做这种题目的时候,应该画出二叉树.然后把叶子补足.叶子的高度就是查找失败的次数.然后求和除以叶子数目就是失败的平均查找长度.而非叶子节点就是成功的,高度就是成功的查找次数,然后除以非叶子节点的数目,就是成功的平均长度.对于11个节点,其构成的二叉树成功的查找长度是(1x1+2X2+3x4+4x4)/11=33/11失败的查找长度是(4x8+3x4)/(8+4)=44/12
能不能在详细些 我这个是考试题目。。
举个例子吧。假定数组中的成为二分查找数的内节点,然后补上叶子节点代表查找失败的。
比如只有一个节点a。那么成功的查找会是 1X1/1=1 ,一次比较,高度为1,处以内节点数目。失败的查找应该是不等于1的,还需要两次查找,分别是左右叶子节点,1X2/2=1。
如果是两个节点,假设a和b,并且不失一般性,设b为a的左节点,那么b的两个叶子节点代表失败情况,需要2次查找,a还有一个右节点代表失败情况,需要一次查找,(2X2+1X1)/3=5/3
依次类推就可以了。

我要回帖

更多关于 java二分法排序 的文章

 

随机推荐