摘要:
思想:通过一趟排序将待排文件分割成独立的两部分,其中一部分记录的排序码均比另一部分记录的排序码小,然后分别对这两部分进行排序,以达到整个文件有序。一趟快速排序的做法是:设两个变量low和high,它们的初值分别是待排序文件的第一个和最后一个记录的位置,并且取一个记录作为枢轴使用,开始从high所指位置向前搜索直到第一个排序码小于枢轴的记录和枢轴的记录交换,然后从low所指位置向后搜索,找到第一个排序码大于枢轴的记录再和枢轴的记录互相交换,重复交替这两步直到low=high为止。程序代码: int Partition(Elem R[],int low,int high) { pivot... 阅读全文
摘要:
程序代码: 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... 阅读全文
摘要:
思想:先对待排序记录进行宏观调整,再进行微观调整。宏观指:将记录序列分成若干个子序列,分布对每个序列进行插入排序。程序代码: 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]; } ... 阅读全文
摘要:
程序代码: 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 =... 阅读全文
摘要:
程序代码: 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)... 阅读全文
摘要:
思路:在二分比较中,如果遇到相等,则: (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... 阅读全文
摘要:
数据结构: struct BinTreeNode; typedef struct BinTreeNode * pBinTreeNode; struct BinTreeNode { KeyType key; //元素的关键码 DataType othre; //元素的属性 PBinTreeNode llink,rlink; }; //字典的存储 typedef struct BinTreeNode *BinTree; typedef BinTree * PBinTree; //字典的指针检索算法: int searchNode(... 阅读全文