数据结构:第八章学习小结
思维导图
排序方法小结
1.快速排序

1 void QuickSort(SqList &L) 2 { 3 QKSort (L, 1, L.length);//调用QKSort方法进行排序 4 } 5 6 void QSort(SqList &L, int low, int high) 7 { 8 int pos; 9 if(low < high) 10 { 11 pos = Partition(L, low, high);//划分左右子表 得到当前左右子表的分界位置 12 QKSort(L, low, pos - 1);//递归划分左子表 13 QKSort(L, pos + 1, high);//递归划分右子表 14 } 15 } 16 17 int Partition (SqList &L, int low, int high) 18 { 19 L.r[0] = L.r[low]; //选择子表的第一个记录作为枢轴 20 pivotkey = L.r[low].key;//以枢轴记录的值来划分左右子表 21 while (low < high) 22 { 23 //从右向左查找小于privotkey的记录 24 //并将其移到左子表 25 while(low<high && L.r[high].key>=pivotkey) 26 --high; 27 L.r[low] = L.r[high]; 28 29 //从左向右查找答于privotkey的记录 30 //并将其移到右子表 31 while(low<high && L.r[low].key<=pivotkey ) 32 ++low; 33 L.r[high] = L.r[low]; 34 } 35 L.r[low]=L.r[0];//将枢轴记录移到分界位置 36 return low;//返回当前的枢轴位置 也就是分界位置 37 }
2.堆排序

1 //调整堆 2 void HeapAdjust(SqList &L, int low, int high) 3 { 4 rc = L.r[low]; 5 for(int j =2*s; j<high; j*=2) 6 { 7 //记录值较大的结点下标 8 if(j<high && L.r[j].key < L.r[j+1].key) //j<m判断是否存在孩子结点 9 ++j; 10 11 //若此时结点的值已经最大,无需再调整,则退出循环 12 if(rc.key >= L.r[j].key) 13 break; 14 15 L.r[low] = L.r[j]; 16 low = j; 17 } 18 L.r[low] = rc; 19 } 20 21 //建堆 22 void CreatHeap(SqList &L) 23 { 24 n = L.length; 25 for(int i=n/2; i>0; --i) 26 HeapAdjust(L, i, n);//将无序序列[0,L.lengh]调整为堆 27 } 28 29 //堆排序 30 void HeapSort(SqList &L) 31 { 32 CreatHeap(L);//建堆 33 for(i=L.length; i>l; --i) 34 { 35 //交换堆顶元素和L.r[i]元素的位置 36 x=L.r[1]; 37 L.r[1]=L.r[i]; 38 L.r[i]=x; 39 //重新调整堆顶 40 HeapAdjust(L, 1, i-1) 41 } 42 }
排序方法比较
可参考书上P267页(⚠重要的是理解这些排序算法)
心得体会
第八章涉及到了各种关于排序的方法,需要理解不同排序方法和相关复杂度的对比分析,接下来要着重理解各种排序方法的比较,同时也要回顾之前学习的内容,整理复习。最后,这个学期即将结束,我学到了很多新算法新结构,接触到了算法复杂度等新知识,感触颇多,希望在以后的学习中仍能运用老师所教导的知识。