2013年9月11日

各种排序总结(六)归并排序

摘要: 1 /**************** 2 思路:假设待排序有n个记录,将这n个记录看成n个有序的子序列,每个子序列长度为1, 3 然后两两归并。 4 如何将将二个有序数列合并:这个非常简单,只要从比较二个数列的第一个数, 5 谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空, 6 那直接将另一个数列的数据依次取出即可。 7 ****************/ 8 #include 9 10 using namespace std;11 12 //将有二个有序数列arr[first...mid]和arr[mid...last]合并。主要是merge这个函数13 .. 阅读全文

posted @ 2013-09-11 15:42 CnZyy 阅读(254) 评论(0) 推荐(0) 编辑

各种排序总结(五)快速排序

摘要: 1 /********************* 2 快排思想: 3 1.i =L; j = R; 选取第一个数为基准数,将基准数挖出形成第一个坑a[0]。 4 2. j—从后向前找到比基准数小的,找到后将此数挖出填入前一个坑中a[i],形成新的坑a[j] 5 3. i++从前向后找到比基准数大的,找到后将此数挖出填入前一个坑中a[j] 6 4. 重复执行2、3步直到i==j,将基准数填入即可 7 ***********************/ 8 #include 9 10 using namespace std;11 12 int Partition(int * arr, int l.. 阅读全文

posted @ 2013-09-11 15:41 CnZyy 阅读(252) 评论(0) 推荐(0) 编辑

各种排序总结(四)冒泡排序

摘要: 思想:一共n-2次外循环,每次循环将最大的数放到未排序的数列的最后。#include using namespace std;void BubbleSort(int* arr, int n){ bool Swap; int i,j; for(i=0; i arr[j+1]) //较大的放到后面 { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; Swap = true; ... 阅读全文

posted @ 2013-09-11 15:39 CnZyy 阅读(187) 评论(0) 推荐(0) 编辑

各种排序总结(三)堆排序

摘要: 不稳定。时间复杂度:建堆时间代价O(n),每次删除堆顶重新建堆O(logn), 所以总时间:O(n)+O(nlogn)=O(nlogn)。最好、最差、平均都是O(nlogn)。空间复杂度:用到一个临时变量,O(1)。总结:由于时间复杂度O(nlogn)较小,因此适用于数组n较大的情况。 阅读全文

posted @ 2013-09-11 15:36 CnZyy 阅读(139) 评论(0) 推荐(0) 编辑

各种排序总结(二)直接选择排序

摘要: /***************思路:外层循环:从0到n-1遍历数组。 对于第i个元素,内层循环:从i+1开始遍历数组找到最小的元素,与i交换。****************/#include using namespace std;void SelectSort(int* arr, int n){ int i,j,temp,min_index; for(i=0; i >n; arr = new int[n]; cout>arr[i]; } SelectSort(arr,n); cout<<"The outcome:"<<endl; . 阅读全文

posted @ 2013-09-11 15:19 CnZyy 阅读(269) 评论(0) 推荐(0) 编辑

各种排序总结(一)直接插入排序

摘要: 思想:插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。从i=1开始往后遍历,对于每个数据记录为temp,从该数据向前探索若比temp大则后移,直至第一个比temp小的数据,将temp插入到这个数据之后。 1 #include 2 3 using namespace std; 4 5 void InsertSort(int* arr,int n) 6 { 7 int i,j,temp; 8 for(i=1;i=0 && temp >n;27 arr = new int[n];28 cout>arr[i];32 ... 阅读全文

posted @ 2013-09-11 15:17 CnZyy 阅读(404) 评论(0) 推荐(0) 编辑

2013年9月9日

《剑指offer》面试题8—旋转数组的最小数字

摘要: 题目:把一个数组最开始的若干个元素搬到数组末尾我们称之为数组的旋转。要求:输入一个递增排序的数组的旋转,输出旋转数组中的最小数字。例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:旋转后的数组可分为两个有序数组,最小的数恰好是分界点。由于是局部有序的,想到用二分查找的方法去查找最小元素。和二分类似,每次取一个index_mid为中间值,如果该数大于index1则说明最小数在后面;如果该数小于index2,则说明最小数在该数前面或者就是该数。例外情况:1.旋转了0个数,即数组仍是有序的;2.mid=index1=index2,此时必须暴力求解。 1 #inc 阅读全文

posted @ 2013-09-09 22:01 CnZyy 阅读(276) 评论(0) 推荐(0) 编辑

函数指针

摘要: 函数指针:1) 函数指针的初始化。函数如下:1intCompareString(conststring&str1,conststring&str2)2{3returnstr1.compare(str2);4}函数的初始化有两种方式:第一种,也是最普遍的方式:1int(*CompareFunction)(conststring&,conststring&)=CompareString;第二种,是使用typedef定义函数类型,这种写法有助于对代码的理解:1typedefint(*CompareFunctionType)(conststring&,const 阅读全文

posted @ 2013-09-09 15:19 CnZyy 阅读(284) 评论(0) 推荐(0) 编辑

2013年9月8日

《剑指offer》面试题22—栈的压入、弹出序列

摘要: 《程序员面试宝典》上也有经典的火车进站问题,类似。如果12345是压栈顺序,序列45321可能是出栈顺序,但序列43512不可能。规律:对序列中任意元素n,排在n后且比n小的元素一定是从大到小顺序排列的,可以不相邻。如果要用编程解决,思路应该是:依次判断出栈序列中的每个数字,如果下一个弹出的数字是栈顶数字则弹出;如果不是则把剩余的未入栈的数字依次入栈,直到把下一个需要弹出的数字压到栈顶为止。如果所有数字都入栈了还未遇到下一个弹出的数字,则该序列不可能是出栈序列。 阅读全文

posted @ 2013-09-08 20:16 CnZyy 阅读(313) 评论(0) 推荐(0) 编辑

《剑指offer》面试题21—包含min函数的栈

摘要: 题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min。要求push,min,pop时间都是O(1)。思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素;min函数直接取辅助栈栈顶元素即可;有元素弹出时辅助栈元素也弹出,这样栈顶就是剩下的元素中的最小的了。 1 #include 2 #include 3 using namespace std; 4 5 template 6 class StackWithMin 7 { 8 public: 9 void Push(const T& element);10 T Min();11 voi... 阅读全文

posted @ 2013-09-08 17:07 CnZyy 阅读(246) 评论(0) 推荐(0) 编辑

导航