c++/算法
adminabcd
爱生活,爱自己
展开
-
递归实现全排列(一)
【思路】下面用具体例子来阐述这种实现的思路,例如实现123的全排列组合。 要求123的全排列,可以分为以下情况: 情况1:第0位为1+23的全排列 情况2:第0位为2+13的全排列 情况3:第0位为3+32的全排列 上面的情况用代码实现如下://情况1//为了跟下面一致,加上swap(list[0],list[0]);perm(list,1,2);//为了跟下面一致,加上swap(l原创 2015-06-07 21:39:36 · 1305 阅读 · 0 评论 -
与运算与异或运算的应用
使用^实现a、b两数的交换 a=a^b; b=a^b; //此时b=a^b^b=a^0=a a=a^b; //此时a=a^b^a=b^0=b使用&、^和移位操作实现(a+b)/2 (a+b)/2=(a&b) + (a^b)>>1 注释: —— >>1代表往右移动移位,即除以2。 ——当a等于b时,a^b=0,a&b即(a+b)2; —— 当a不等于b时,原创 2016-03-26 21:46:53 · 656 阅读 · 0 评论 -
排序算法之(4)——快速排序
快速排序的思想是选取数组中的一个数为分界线,把大于它的数尽量往后放,小于它的数往前放。这样每一趟快速排序都确定一个数的最终位置,并且把数组list[p,…………,r]分成以list[q]为分界线的两个子数组。一般情况下,我们可以选择数组的最后一个元素作为分界线。原创 2015-06-09 10:53:55 · 846 阅读 · 0 评论 -
排序算法之(7)——堆排序
【堆排序的思路】堆排序主要是利用了堆的性质,对于大顶堆:堆中的每个节点的值都不小于它的孩子节点的值原创 2015-07-16 10:42:07 · 720 阅读 · 0 评论 -
排序算法之(2)——选择排序
【选择排序的思想】选择排序就是每次从待排序元素中找出最小元素,放在其最终位置上(即待排序元素的第一个位置),与冒泡排序不同,选择排序只有在找出的最小元素不在其最终位置的情况下才进行交换。原创 2015-06-06 11:32:18 · 432 阅读 · 0 评论 -
排序算法之(1)——冒泡排序
**【冒泡排序的思想】** 冒泡排序总共进行n-1趟,每一趟扫描总是通过两两比较把大的往后放,所以第一趟即把最大数放在最后面,接着第二趟把第二大数放在倒数第二的位置………….到n-1完成,此时只有一个数未排序,这个数就是最小元素,不再需要扫描,此时完成对所有元素的排序。原创 2015-06-06 10:11:49 · 1413 阅读 · 0 评论 -
排序算法之(5)——归并排序(递归实现)
【归并排序的思想】归并排序的思想是如果子数组L和子数组R都是有序的,那么我们可以将其合并为一个有序数组;在归并排序中,首先将子数组的长度设为1,此时每个元素都是一个有序子数组,通过两两合并,我们可以得到若干个长度为2的有序子数组,然后对这些长度为2的子数组两两合并,就可以得若干个到长度为4的有序子数组……………………如此下去,最终将合并为一个有序的数组。原创 2015-06-10 16:42:24 · 699 阅读 · 0 评论 -
排序算法之(6)——基数排序
【基数排序的思想】首先使用基数r=10进行分解,将每个整数分成d位(d是待排元素中的最大位数),每位的取值范围是0~9;因为每一位有10种可能的情况,所以建立10个链表,即lists[0]~list[9],分别代表相应位为0、1、2、3、4、5、6、7、8、9。原创 2015-07-04 09:44:42 · 869 阅读 · 0 评论 -
排序算法之(3)——插入排序
【插入排序的思路】插入排序首先把第0个数作为已排好的数,然后依次将位置1、2……n-1上的数插入到已排好的数中,那么插入排序总共需要n-1趟,每一趟把一个数插入到最终位置。原创 2015-06-08 20:08:24 · 530 阅读 · 0 评论 -
二分查找
【二分查找的思路】二分查找只适用与有序数据,它的执行过程不是像顺序查找那样从第0个开始一直往后找,直到最后一个;二分查找首先查找的是中间位置,若中间位置的元素就是要找的元素,则找到;如果中间位置的元素小于要找的元素,那么要找的元素位于后半部分,往后找;如果中间位置的元素大于要找的元素,那么要找的元素位于前半部分,往前找。【代码实现】下面代码包括二分查找的一般实现以及递归实现:#include<ios原创 2015-06-06 16:18:23 · 823 阅读 · 0 评论 -
c++实现两个数的交换
在c++中,有以下四种方法可以实现两个数的交换:1、指针传递void swap1(int *p,int *q) { int temp=*p; *p=*q; *q=temp;}2、宏定义 #define swap2(x,y,z) ((z)=(x),(x)=(y),(y)=(z)) 3、引用传递 void swap3(int &x,int &y) { i原创 2015-06-05 12:38:58 · 10842 阅读 · 0 评论 -
找出有序数组中的绝对值的最小值
假设数组是从小到大排序,数值可能为负数、0、正数。思路一可以一次性遍历一遍,找出绝对值最小值,此时时间复杂度为O(N),缺点是没有利用数组是有序的这一特点。思路二数组有序,可以利用二分查找的特性。中间的数是正数,往后找;中间的数是负数,往前找。问题的本质是找到正数的最小值,或负数的最大值,分析以下集中情况数组为a[], 数组大小为n.n=1,没有商量的余地,直接返回 ...转载 2016-08-20 22:11:04 · 3188 阅读 · 1 评论