随笔分类 -  数据结构笔试题集锦_查找和排序篇(不断更新)

摘要:思路:假设初始序列含有n个记录,可以看成n个有序的子序列,每个子序列的而长度为l,然后把每i(i>=2)个子序列归并,得到n/i个长度为i的有序子序列,再继续归并,如此重复直到得到一个长度为n的有序序列为止。这种排序方法称为i路归并排序。在内部排序中,通常是采用2路归并排序。程序代码: void Merge(Elem temp[],Elem R[],int low,int mid,int high) //将temp中的两个有序子序列归并到R中 { for(i = low,j = mid+1,k = low;i <= mid && j <= high;k++) 阅读全文
posted @ 2012-09-13 21:41 毛毛hhmm 阅读(172) 评论(0) 推荐(0)
摘要:程序代码: void HeapAdjust(Elem R[],int s,int m) { rc = R[s]; for(i = 2*s;i <= m; i++) //查找rc应插入的位置 { if((i < m && R[i]<R[i+1]) i++; //i为左右子树较大记录的下标 if(rc > R[i]) break; R[s] = R[i]; s = i; } R[s] = rc; } void HeapSort(Elem R[],int ... 阅读全文
posted @ 2012-09-13 20:59 毛毛hhmm 阅读(127) 评论(0) 推荐(0)
摘要:程序代码: void SelectSort(Elem R[],int n) { for(i = 1;i < n;i++) { //选择第i小的记录,并交换到位 min = R[i]; for(j = i;j <= n;j++) if(R[j] < min) min = R[j]; if(i != j) swap(s[i],s[j]); } }时间复杂度:比较次数(n-1)+(n-2)+---+1 = n(n-1)/2; 移动次数最小值为0,最大值为3(n-1)。稳定性:不稳定... 阅读全文
posted @ 2012-09-13 18:53 毛毛hhmm 阅读(161) 评论(0) 推荐(0)
摘要:思想:通过一趟排序将待排文件分割成独立的两部分,其中一部分记录的排序码均比另一部分记录的排序码小,然后分别对这两部分进行排序,以达到整个文件有序。一趟快速排序的做法是:设两个变量low和high,它们的初值分别是待排序文件的第一个和最后一个记录的位置,并且取一个记录作为枢轴使用,开始从high所指位置向前搜索直到第一个排序码小于枢轴的记录和枢轴的记录交换,然后从low所指位置向后搜索,找到第一个排序码大于枢轴的记录再和枢轴的记录互相交换,重复交替这两步直到low=high为止。程序代码: int Partition(Elem R[],int low,int high) { pivot... 阅读全文
posted @ 2012-09-12 21:46 毛毛hhmm 阅读(610) 评论(0) 推荐(0)
摘要:程序代码: void BubbleSort(Elem R[],int n) { i = n; while(i > 1) { last_exchange = 1; for(j = 1;j < i;j++) if(R[j] > R[j+1]) { swap(R[j],R[j+1]); last_exchange = j; } i = last_exchange; } }最好情况:记录有序,比较次数n-1,移动次数为0;最差情况:记录逆序,比较次数(n-1)+(n... 阅读全文
posted @ 2012-09-12 21:22 毛毛hhmm 阅读(136) 评论(0) 推荐(0)
摘要:思想:先对待排序记录进行宏观调整,再进行微观调整。宏观指:将记录序列分成若干个子序列,分布对每个序列进行插入排序。程序代码: void ShellInsert(Elem R[],int dk) { for(i = dk+1; i < R.length; i++) if(R[i-dk] > R[i]) { R[0] = R[i]; for(j = i - dk;(j > 0) && (R[0] < R[j]); j -= dk) R[j+dk] = R[j]; R[j+dk] = R[0]; } ... 阅读全文
posted @ 2012-09-12 21:02 毛毛hhmm 阅读(167) 评论(0) 推荐(0)
摘要:程序代码: void BInsertionSort(Elem R[],int n) { for(i = 2;i <= n;i++) if(R[0] < R[i]) { R[0] = R[i]; low = 1; high = i-1; while(low <= high) { mid = (low+high)/2; if(R[0] < R[mid]) high = mid-1; else low =... 阅读全文
posted @ 2012-09-12 20:45 毛毛hhmm 阅读(109) 评论(0) 推荐(0)
摘要:程序代码: void InsertionSort(Elem R[],int n) { for(i = 2;i <= n;i++) if(R[i-1] > R[i]) { R[0] = R[i]; for(j = i-1;R[0] < R[j];j--) R[j+1] = R[j]; R[j+1] = R[0]; } }最好情况:记录有序,比较次数为n-1,移动次数为0;最差情况:记录逆序,比较次数2+3+---+n=(n+2)(n-1)/2,移动次数为(2+1)+(3+1)+---+(n+1)... 阅读全文
posted @ 2012-09-12 20:05 毛毛hhmm 阅读(153) 评论(0) 推荐(0)
摘要:思路:在二分比较中,如果遇到相等,则: (1).如果当前下标为0,或者key与pdic->element[mid-1].key不等,那么mid一定是key第一次出现的下标,返回mid即可; (2).如果(1)不成立,那么mid一定大于等于key第一次出现的下标,需要在low和mid-1之间继续进行搜索,找出key第一次出现的下标。时间复杂度:O(logn)。程序代码: int binarySearch(SeqDictinoary * pdic,KeyType key,int *position) { int low = 0,high = pdic->n-1,mid; whi... 阅读全文
posted @ 2012-09-12 16:31 毛毛hhmm 阅读(438) 评论(0) 推荐(0)