排序算法:快速排序 原文出处. 快速排序采用的思想是分治思想。 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 举例说明一下吧,这个可能不是太好理解。假设要排序的序列为 2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移 2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置 2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面 2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变 经过第一轮的快速排序,元素变为下面的样子 [1] 2 [4 9 3 6 …
阅读全文 »#include<iostream> #include<string> using namespace std; //将一个string倒置 void reverse(string &a) { char temp; for(int i=0; i<=(a.size()-2)/2; i++) { temp=a[i]; a[i]=a[a.size()-i-1]; a[a.size()-i-1]=temp; } } //默认s1为正序,s2为正序,【2-36任意进制转化】 string NtoN(string s1,long base1,long base2) { string s2; long sum=0,yushu; string::iterator it; it=s1.begin(); while(it!=s1.end()) { sum*=base1; if(*it<=’9′ && *it>=’0′) sum+= *it-’0′; else sum+= *it+10-’A'; *it++; } cout<<"sum(decimal):"<<sum<<endl; while(sum!=0) { …
阅读全文 »刚刚看到了一道题. 一把1级屠龙刀,最高可以升到9级,每次升级成功率30%,失败率70%。失败会退一级,最差退到1级。 那么在1000次内升级到9级的概率为多少? 尝试写了一个php的模拟,第一次没设定失败下限.结果很给力. 第994次升级结果:屠龙刀等级为:-358! 第995次升级结果:屠龙刀等级为:-359! 第996次升级结果:屠龙刀等级为:-358! 第997次升级结果:屠龙刀等级为:-359! 第998次升级结果:屠龙刀等级为:-360! 第999次升级结果:屠龙刀等级为:-361! 后来运气好了一次. 第342次升级结果:屠龙刀等级为:7!最高等级为7 第343次升级结果:屠龙刀等级为:8!最高等级为8 第344次升级结果:屠龙刀等级为:9!最高等级为9 坑爹九级神器! 代码如下,群里有个大大的高端代码,我也留下来。 <?php $Updateresultabby = array( array( ‘return’ => -1, ‘range’ => ’70′ ), array( ‘return’ => 1, ‘range’ => ’30′ ) ); $level =1 ; $level_max =2; for( $i = 0; $i < 2000; $i++ ){ …
阅读全文 »string number1,number2; std::cout<<tip[0]<<"\n"<<tip[1]<<std::endl; std::cin>>number1; while(!isdigit(number1)){ std::cout<<tip[5]<<std::endl; std::cin>>number1; } std::cout<<tip[2]<<std::endl 大概就是这个过程吧,会出现神马情况呢,如果cin接受的用户输入不是0~9而是其他呢. 我觉得木有亲手打过的童鞋100%说,循环判断是不是数字,不是就停下来等用户输入下一次. 那么好,扔VS里调试下吧.结果呢,无限循环吧.. 原因 是什么呢.这里很明显嘛,为什么会循环,while嘛,为什么while会死循环,!isdigit(number1)成立.. 所以呢,number1,也就是从cin传递来的用户输入有问题. 有什么问题呢. typeid(number1).name(); 后得到一个反馈..嗯.char类型.. 那么如何解决呢? 我觉得加段小函数检查就可以了.. bool IsNumber(string s){ const char *tmp = s.c_str(); for(int i =0;i<s.length();i++) { if (tmp[i]>57||tmp[i]<48) return false; } return true; }
阅读全文 »ROUND函数在很多语言中都存在,它的“bug”也威名远播… 关于它的舍入问题,很多人都总结过吧,四舍六入五成双。 文章包含代码以及一些引用资料,如果感兴趣,可以选择阅读全文。
阅读全文 »原文出处:http://www.baiba.net/blog/?action=show&id=61
这篇不收录过来实在是…对不起自己…嘿嘿~
都在Dev-C++里跑了一遍。
[c]
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int x=0,y[14],*z=&y;
*(z++)=0×48;
*(z++)=y[x++]+0x1D;
*(z++)=y[x++…
![[javascript]排序算法-快速排序](http://cache.promiseforever.com/wp3/images/image_shadow.png)