前言
不知不觉,数据结构已经学完了,博主也马上大二了😭时间过得太快了😱,但是数据结构学得确实不太好,楼主花了将近一天的时间整理了一下排序的有关算法。希望对大家也有所帮助。
目录
插入排序
基本思想
每步将一个待排序记录,按其关键码大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。
直接插入排序
void InsertSort ( SqList &L ) {
//对顺序表L作直接插入排序
for ( i = 2; i <=L.length; ++ i )
//直接在原始无序表L中排序
if (L.r[i].key < L.r[i-1].key) //若L.r[i]较小则插入有序子表内
{
L.r[0]= L.r[i]; //先将待插入的元素放入“哨兵”位置
L.r[i]= L.r[i-1]; //子表元素开始后移
for ( j=i-2; L.r[0].key < L.r[j].key; --j ) L.r[j+1]= L.r[j];
//只要子表元素比哨兵大就不断后移
L.r[j+1]= L.r[0]; //直到子表元素小于哨兵,将哨兵值送入
//当前要插入的位置(包括插入到表首)
} //if
}// InsertSort
从第二个记录开始逐趟开始插入
折半插入排序
这个相对于直接插入排序,减少了比较的次数,但是没有减少移动的次数: n 2 n^2 n2 / 4次
只是我们查找插入的位置时,使用了折半查找的方法。
二路排序
相比之下,减少了移动的次数,约为 n 2 n^2 n2 / 8次
#include <stdio.h>
#include <stdlib.h>
void insert(int arr[], int temp[], int n)
{
int i,first,final,k;
first = final = 0;//分别记录temp数组中最大值和最小值的位置
temp[0] = arr[0];
for (i = 1; i < n; i ++){
// 待插入元素比最小的元素小
if (arr[i] < temp[first]){
first = (first - 1 + n) % n;
temp[first] = arr[i];
}
// 待插入元素比最大元素大
else if (arr[i] > temp[final]){
final = (final + 1 + n) % n;
temp[final] = arr[i];
}
// 插入元素比最小大,比最大小
else {
k = (final + 1 + n) % n;
//当插入值比当前值小时,需要移动当前值的位置
while (temp[((k - 1) + n) % n] > arr[i]) {
temp[(k + n) % n] =temp

最低0.47元/天 解锁文章
4742

被折叠的 条评论
为什么被折叠?



