用旋转聚转法将旋转十一个人数组合成七个数

用选择法对有十个数组元素的一维数组按由小到大进行排序输出_百度知道
用选择法对有十个数组元素的一维数组按由小到大进行排序输出
我有更好的答案
len#include &i++) L0[i]=rand()%100.h&i& }}int
main(){ int *L0,i; return 0,k;j++)
if(L[j]&lt, n);n.h&%d&会产生n个随机数进行排序 L0=(int *)malloc(sizeof(int)*n),&n);L[k])
k=j;i++) {
k=i;L[i]=L[k];#include &n,L0[i]);;#include & srand((unsigned)time( NULL ) ),int
for(i=1;L[k]=L[0];
/string,n;;i& for(i=1;%d & scanf(&i&lt,j;#include &j& for(i=1;void Simple_select_sort(int
L[];i++) printf(&quot.h&
L[0]=L[i];&#47.h& Simple_select_sort(
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁面试题8:旋转数组中的最小数字 - 推酷
面试题8:旋转数组中的最小数字
旋转数组的特点:
(1)递增排序的数组旋转之后的数组可划分为两个排序的子数组;
(2)前面的子数组的元素都大于或等于后面子数组的元素;
(3)最小的元素刚好是两个子数组的分界线;
(4)旋转数组
在一定程度上是有序的
&&&&&& 在有序的数组中可以用二分查找实现O(logn)的查找,我们也可用二分查找的思想寻找旋转数组的最小数字。
设置两个指针,初始状态第一个指针指向前面子数组的第一个元素,
第二个指针指向后面子数组的最后一个元素;
找到两个指针的中间元素;
若其大于等于第一个指针指向的元素,则说明其在前面的子数组中,且显然最小元素在中间元素的右边,若其小于等于第二个指针指向的元素,则说明其在后面的子数组中,且显然最小元素在中间元素的左边。
如此,便可以缩小搜索范围,提高时间复杂度,最终第一个指针指向前面子数组的最后一个元素,而第二个指针指向后面子数组的第一个元素,它们处于相邻位置,而第二个指针指向的刚好是最小的元素。
注意:当两个指针指向的数字及它们中间的数字三者相等时,无法判断中间数字位于前面的子数组还是后面的子数组,也就无法移动两个指针来缩小查找的范围,此时只能用顺序查找的方法。
例如:数组{1,0,1,1,1}和数组{1,1,1,0,1}都可看成是递增数组{0,1,1,1,1}的旋转。第一种情况,中间数字位于后面的子数组,第二种情况,中间数字位于前面的子数组。
(5)按旋转规则,第一个元素应该是大于或等于最后一个元素的;
&&&&& 但也有
:若把排序数组的前0个元素搬到最后面,及排序数组本身,仍是数组的一个旋转,此时数组中的第一个数字是最小的数字。
C++代码(不完全正确):
#include &stdafx.h&
#include &iostream&
int BinarySearch_MinNumInRotateArr(int *nArr, int nLength)
if (nArr!=NULL && nLength&0)
int low = 0;
int high = nLength - 1;
int mid = 0;
while ((low+1) != high)
mid = low + ((high - low) && 1);
if (nArr[low] == nArr[high] && nArr[low] == nArr[mid])
int min = nArr[low];
for (int i=low+1; i&= i++)
if (min & nArr[i])
min = nArr[i];
if (nArr[mid] &= nArr[low])
else if (nArr[mid] &= nArr[high])
return nArr[high];
cout && &数组为空!& &&
return -1;
int _tmain(int argc, _TCHAR* argv[])
int nArr1[5] = {3,4,5,1,2};
cout && BinarySearch_MinNumInRotateArr(nArr1, 5) &&
int nArr2[5] = {1,0,1,1,1};
cout && BinarySearch_MinNumInRotateArr(nArr2, 5) &&
int nArr3[5] = {1,1,1,0,1};
cout && BinarySearch_MinNumInRotateArr(nArr3, 5) &&
int nArr4[5] = {1,2,3,4,5};
cout && BinarySearch_MinNumInRotateArr(nArr4, 5) &&
system(&pause&);
不能解决特例数组。
C++代码(正确解决特例):
#include &stdafx.h&
#include &iostream&
int BinarySearch_MinNumInRotateArr(int *nArr, int nLength)
if (nArr!=NULL && nLength&0)
int low = 0;
int high = nLength - 1;
while (nArr[low] &= nArr[high])
if (high - low == 1)
mid = low + ((high - low) && 1);
if (nArr[low] == nArr[high] && nArr[low] == nArr[mid])
int min = nArr[low];
for (int i=low+1; i&= i++)
if (min & nArr[i])
min = nArr[i];
if (nArr[mid] &= nArr[low])
else if (nArr[mid] &= nArr[high])
return nArr[mid];
cout && &数组为空!& &&
return -1;
int _tmain(int argc, _TCHAR* argv[])
int nArr1[5] = {3,4,5,1,2};
cout && BinarySearch_MinNumInRotateArr(nArr1, 5) &&
int nArr2[5] = {1,0,1,1,1};
cout && BinarySearch_MinNumInRotateArr(nArr2, 5) &&
int nArr3[5] = {1,1,1,0,1};
cout && BinarySearch_MinNumInRotateArr(nArr3, 5) &&
int nArr4[5] = {1,2,3,4,5};
cout && BinarySearch_MinNumInRotateArr(nArr4, 5) &&
int *nArr5 = NULL;
cout && BinarySearch_MinNumInRotateArr(nArr5, 5) &&
system(&pause&);
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致otate&Array(旋转数组)Rotate&an&array&of&n&elements&to&the&right&by&k&steps.For&example,&with&n&=&7&and&k&=&3,&the&array&[1,2,3,4,5,6,7]&is&rotated&to&[5,6,7,1,2,3,4].&Note:Try&to&come&up&as&many&solutions&as&you&can,&there&are&at&least&3&different&ways&to&solve&this&problem.&旋转n个元素向右移k步的阵列例如:n&=&7,k&=&3.&数组[1,&2,&3,&4,&5,&6,&7]旋转以后得到的数组是[5,6,7,1,2,3,4]提示:尝试尽可能多的方法来实现,至少有三种方法可以解决这个问题。&假设:[1,2,3,4,5,6,7]当k=3时,分界点是5。思路一:从5开始,逐个将5以后的数移动到指定位置。第一步得到[5,&1,&2,&3,&4,&6,&7].&第二步得到[5,&6,&1,&2,&3,&4,&7]第三步得到[5,&6,&,&71,&2,&3,&4](即为所得)具体实现代码:void&rotate(int&nums[],&int&n,&int&k)&{&&&&int&&&&&for&(int&step&=&0;&step&<&k;&step++)&{&&&&&&&&temp&=&nums[n-1];&&&&&&&&for&(int&i&=&n-1;&i&>&0;&--i)&&&&&&&&{&&&&&&&&&&&&nums[i]&=&nums[i-1];&&&&&&&&}&&&&&&&&nums[0]&=&&&&&}}提交结果,当数据规模大时,超时。&思路二(算法改进):先将5以前的数据翻转得到的数组是[4,3,2,1,5,6,7]再将5及以后的数据翻转得到的数组是[4,3,2,1,7,6,5]再将整个数组翻转即得到[5,6,7,1,2,3,4].&(即为所求)具体实现代码:public&static&void&rotate(int[]&nums,&int&k)&{&&&&&&&&int&length&=&nums.&&&&&&&&&&&&&&&&k&=&k&%&&&&&&&&&&&&&&&&&if(length&==&1)&&&&&&&&&&&&&&&&&&&&&&&&if(k&==&0)&&&&&&&&&&&&&&&&&&&&&&&&reversal(nums,&0,&length&-&k&-&1);&&&&&&&&reversal(nums,&length&-k,&length&-&1);&&&&&&&&reversal(nums,&0,&length&-&1);&&&&}public&static&void&reversal(int[]&nums,&int&i,&int&j){int&t&=&0;while(i&=&0){t&&&&&&&=&nums[i];nums[i]&=&nums[j];nums[j]&=&t;i++;j--;}}提交结果:&
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.003 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益c语言求一个数的翻转数,,用数组编写的。_百度知道
c语言求一个数的翻转数,,用数组编写的。
a[len-1-i]=a[i];&main(){&i&i++){&a[maxn];&&&&&nbsp,a);int&&&&&&i.h&&&nbsp.h&&maxn&&&puts(a);&len=strlen(a);&&&&&&&&&&&&&}&&&&&100int&#include&&&&&&&&#define&int&%s&a[i]=&&&nbsp.h&&&&&&&&&return&ch=a[len-i-1];&&for(i=0;char&&&;char&&&&#include&&lt?#include&nbsp是这个意思么;scanf(&len/2;0
看不懂啊←_←
#include&&stdio.h&#include&&stdlib.h&#include&&string.h&#define&maxn&100//默认这个数最大100位int&main(){&&&&char&a[maxn];&&&&scanf(&%s&,a);&&&&int&len=strlen(a);//取得这个数的实际位数,比如1234就是4位&&&&char&&&&&int&i;&&&&for(i=0;i&len/2;i++){//交换这个数的对应位置,比如1234,把1与4,&&,2与3交换就成&&&&&&&&&&&&&&&&&&&&&&&&&&//了4321,翻转过来了&&&&&&&&ch=a[len-i-1];&&&//ch起到一个临时的存变量的作用&&&&&&&&a[len-1-i]=a[i];&&&&&&&&a[i]=&&&&}&&&&puts(a);//打印翻转后的数&&&&return&0;}
能不能最大为1000000
当然可以,,
其他类似问题
为您推荐:
c语言的相关知识
其他2条回答
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 旋转数组的最小数字 的文章

 

随机推荐