摘要:
快速排序算法里的partition函数用来解决这样一个问题:给定一个数组arr[]和数组中任意一个元素a,重排数组使得a左边都小于它,右边都不小于它。 // arr[]为数组,start、end分别为数组第一个元素和最后一个元素的索引 // povitIndex为数组中任意选中的数的索引 1 int partition(int arr[], int start, int end, int pivotIndex) 2 { 3 int pivot = arr[pivotIndex]; 4 swap(arr[pivotIndex], arr[end]); 5 int stor...
阅读全文
posted @ 2012-10-24 22:35
ckook
阅读(17214)
推荐(1)
摘要:
问题:编写反转字符串的程序,要求优化速度、优化空间。此处以整型数组为例,代码如下:/*用位运算快速交换两个数,注意必须确保两个数不是同一实例*/#define swap(a, b) {*(a) ^= *(b); *(b) ^= *(a); *(a) ^= *(b);}/*翻转数组*/void reverse(int arr[], int len){ int halflen = len / 2; int iend = len - 1; for(int i=0; i < halflen; i++) /*只需遍历一半*/ swap(&arr[i], &arr[...
阅读全文
posted @ 2012-05-30 11:22
ckook
阅读(354)
推荐(0)
摘要:
问题:一副扑克牌不含大小王共52张牌,现要求对一副扑克牌进行随机洗牌,时间复杂度O(n)。解答:该问题本质上就是由原排列产生一个随机排列(可以不是全排列)。代码如下:#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 52#define swap(a, b) int tmp = (a); (a) = (b); (b) = tmp/*Inplace洗牌算法*/void shuffle(int arr[], int len){ srand((unsigned int)time(NULL)
阅读全文
posted @ 2012-05-29 21:09
ckook
阅读(486)
推荐(0)
摘要:
问题:将8颗棋子放入一个8行8列的棋盘中,要求每颗棋子所在的行、列以及正斜线上不能有其它棋子。将所有可能的棋局输出。 显见每行且每列只能放置一颗棋子,才能满足每颗棋子所在的行、列不能有其它棋子。那么,假设去除正斜线上不能有多颗棋子这一限制条件,原问题就转化为8个元素全排列的问题。 于是我们得到了解决方案,生成所有8! 种排列并去除那些斜线上有多颗棋子的排列。这样就要生成 8! 种排列,不但计算量大,而且其中绝大部分不满足同一斜线上不能有多颗棋子这一条件。那么有没有优化的办法? 有!——那就是回溯(试错):递归的生成排列,在生成的过程中,一旦产生不满足斜线限制条件的排列则不再继续深入其子排...
阅读全文
posted @ 2012-05-29 20:26
ckook
阅读(372)
推荐(0)
摘要:
一个整数数组A[n]已排序,在数组中查找一个值为val的数,若存在则返回该数在数组中的位置k,有以下四个问题:1. 数组由小到大排列时,要求k最靠左2. 数组由小到大排列时,要求k最靠右3. 数组由大到小排列时,要求k最靠左4. 数组由大到小排列时,要求k最靠右这四个问题用线性扫描搜索解决很简单,但如果用二分法如何正确的搜索呢?以下给出这四个问题的解答,注意差异,感兴趣的读者可以自己分析一下为什么会有这些差异。int binsearch_leftmost_asc(int key, int arr[], int len){ int left = 0; int right = len ...
阅读全文
posted @ 2012-05-29 18:57
ckook
阅读(553)
推荐(0)