第八章数据结构小结
一、插入排序
直接插入排序: 一 一比对
折半插入排序:在已经拍好的序列中插入,适合初始记录无序、n较大的情况
直接插入排序代码实现
1 void InsertSort(SqList &L){ 2 //对顺序表L做直接插入排序 3 for(i=2;i<=L.length;++i) 4 if(L.r[i].key<L.r[i-1].key)//若小于,需将r[i]插入有序子表 5 { 6 L.r[0]=L.r[i]; //将待插入的记录暂存到监视哨中 7 L.r[i]=L.r[i-1];//r[i-1]后移 8 for(j=i-2;L.r[0].key<L.r[j].key;--j)//从后向前寻找插入位置 9 { 10 L.r[j+1]=L.r[j];//记录逐个后移 11 L.r[j+1]=L.r[0]; 12 } 13 } 14 }
二、交换排序
冒泡排序:左右一 一比对
快速排序:选一个作为分隔,对其进行左右两端分隔,然后利用递归,一 一划分
三、选择排序
简单选择排序/直接选择排序:以第一个数进行比较,然后找到里面最小的那一个数后,调换位置,紧接着第二个数开始(还是可以用循环)
void SelectSort(SqList &L) { for(int i=1 ; i<L.length ; ++i) { k = i ; for(int j=i+1 ; j<=L.length ; ++j) {//选择关键字最小的记录 if(L.r[j].key < L.r[k].key) { k = j ; //k指向此趟排序中关键字最小的记录 } } if(k != i) {//交换r[i]与r[k] t = L.r[i] ; L.r[i] = L.r[k] ;L.r[k] = t ; } } }
树形选择排序:从树的叶子到根,两两比较,换位
堆排序:调整堆、建初堆(筛选法)
四、归并排序
将两个或两个以上的有序表合成一个有序表