import time import random import copy def InsertSort(R): #对R[0..n-1]按递增有序进行直接插入排序 def BinInsertSort(R): #对R[0..n-1]按递增有序进行折半插入排序 for i in range(1,len(R)): if R[i]<R[i-1]: #反序时 tmp=R[i] #将R[i]保存到tmp中 low,high=0,i-1 while low<=high: #在R[low..high]中折半查找插入位置high+1 mid=(low+high)//2 #取中间位置 if tmp<R[mid]: high=mid-1 #插入点在左区间 else: low=mid+1 #插入点在右区间 for j in range(i-1,high,-1): #元素集中后移 R[j+1]=R[j] R[high+1]=tmp #插入原来的R[i]
时间: 2024-01-21 11:04:29 浏览: 63
这段代码实现了直接插入排序和折半插入排序两种算法,可以按照以下方式解释:
- InsertSort(R)函数实现了直接插入排序算法,对输入的序列R进行排序,并返回排序后的结果。直接插入排序的思想是将待排序的序列分成已排序和未排序两部分,每次从未排序的部分中取出一个元素,插入到已排序的部分中,使得插入后的序列仍然保持有序。具体实现时,从第二个元素开始,逐个将元素插入到前面已经排好序的子序列中,直到所有元素都被插入到已排序的部分中。
- BinInsertSort(R)函数实现了折半插入排序算法,对输入的序列R进行排序,并返回排序后的结果。折半插入排序算法是在直接插入排序算法的基础上优化而来的,其基本思想是使用二分查找来确定插入位置,从而减少比较次数。具体实现时,对于每一个元素,使用二分查找在已排序的子序列中找到插入位置,然后将元素插入到该位置。在查找插入位置时,使用二分查找的算法可以大大减少比较次数。
相关问题
class RecordNode(object): def __init__(self, key, data): self.key = key self.data = data class SqList(object): def __init__(self, maxSize): self.maxSize = maxSize self.list = [None]*self.maxSize self.len = 0 def insert(self,i,x): if self.len == self.maxSize: raise Exception("顺序表已满") if i < 0 or i > self.len: raise Exception("插入位置不合理") for j in range(self.len-1 , i-1, -1): self.list[j] = self.list[j-1] self.list[i] = x self.len += 1 def insertsort(self): for i in range(1, self.len): p = self.list[i] j = i - 1 while j >= 0: if self.list[i].key > p.key: self.list[j + 1] = self.list[j] j -= 1 else: break self.list[j + 1] = p怎么测试?
这段代码是Python实现的顺序表数据结构,其中包括了插入和插入排序的方法。要测试这段代码,可以按照以下步骤:
1. 创建一个SqList对象,指定最大容量为n(n为一个正整数),例如:lst = SqList(n)
2. 向列表中插入元素,可以调用insert方法,指定插入位置和元素,例如:lst.insert(0, RecordNode(key1, data1))
3. 插入若干个元素后,可以调用insertsort方法对列表进行插入排序,例如:lst.insertsort()
4. 最后,可以遍历列表中的元素,验证排序效果是否正确,例如:for i in range(lst.len): print(lst.list[i].key, lst.list[i].data)
//直接插入排序 #include<iostream> #include<fstream> using namespace std; #define MAXSIZE 20 //顺序表的最大长度 #define OK 0 #define ERROR -1 typedef char* InfoType; typedef struct { int key;//关键字项 InfoType otherinfo;//其他数据项 }RedType;//记录类型 typedef struct { RedType r[MAXSIZE+1];//r[0]闲置或用做哨兵单元 int length;//顺序表长度 }SqList;//顺序表类型 //初始化一个空的顺序表L void InitSqList(SqList &L) { L.length = 0; } //将待排序记录依次插入顺序表L void InsertSqList(SqList &L,ifstream& in) { int n;//待排序记录的个数 in>>n; if(n > MAXSIZE) exit(ERROR); for(int i=1; i<=n; ++i) { in>>L.r[i].key; ++L.length; } } //打印顺序表L void show(SqList L) { for(int i=1; i<=L.length; ++i) cout<<L.r[i].key<<" "; cout<<endl; } //对顺序表L做直接插入排序 //要求调用show函数打印每一趟排序的结果 void InsertSort(SqList &L) { show(L);//打印初始待排序序列 /*-------------代码开始------------------*/ for(i=2;i<L.length;++i) if(L.r[i].key<L.r[i-i].key) { L.r[0]+L.r[i]; L.r[i]=L.r[i-1]; for(j=i-2;L.r[0].ke y<L.r[j].key;--j) L.r[J+1]=L.r[j]; L.r[j+1]=L.r[0]; } /*-------------代码结束------------------*/ } int main() { ifstream in("data/测试数据.txt");//测试数据 SqList L; InitSqList(L); InsertSqList(L,in); InsertSort(L); return OK; }优化这段代码
这段代码的直接插入排序算法实现存在一些问题,比如变量i和j没有定义,以及在插入排序的过程中没有调用show函数打印每一趟排序的结果。此外,这段代码中的排序算法实现也没有进行优化。以下是优化后的代码:
```c++
//直接插入排序
#include<iostream>
#include<fstream>
using namespace std;
#define MAXSIZE 20 //顺序表的最大长度
#define OK 0
#define ERROR -1
typedef char* InfoType;
typedef struct {
int key;//关键字项
InfoType otherinfo;//其他数据项
}RedType;//记录类型
typedef struct {
RedType r[MAXSIZE+1];//r[0]闲置或用做哨兵单元
int length;//顺序表长度
}SqList;//顺序表类型
//初始化一个空的顺序表L
void InitSqList(SqList &L) {
L.length = 0;
}
//将待排序记录依次插入顺序表L
void InsertSqList(SqList &L,ifstream& in) {
int n;//待排序记录的个数
in>>n;
if(n > MAXSIZE) exit(ERROR);
for(int i=1; i<=n; ++i) {
in>>L.r[i].key;
++L.length;
}
}
//打印顺序表L
void show(SqList L) {
for(int i=1; i<=L.length; ++i)
cout<<L.r[i].key<<" ";
cout<<endl;
}
//对顺序表L做直接插入排序
//要求调用show函数打印每一趟排序的结果
void InsertSort(SqList &L) {
show(L);//打印初始待排序序列
/*-------------代码开始------------------*/
for(int i=2; i<=L.length; ++i) {
if(L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i]; //将L.r[i]暂存到L.r[0]
int j;
for(j=i-1; L.r[0].key < L.r[j].key; --j) {
L.r[j+1] = L.r[j]; //记录后移
}
L.r[j+1] = L.r[0]; //插入到正确位置
}
show(L); //打印每一趟排序的结果
}
/*-------------代码结束------------------*/
}
int main() {
ifstream in("data/测试数据.txt");//测试数据
SqList L;
InitSqList(L);
InsertSqList(L,in);
InsertSort(L);
return OK;
}
```
在优化后的代码中,我们对直接插入排序算法进行了优化,具体包括:
1. 在插入排序的过程中,使用了哨兵技术,将L.r[i]暂存到L.r[0]中,避免了反复交换记录的操作。
2. 在排序过程中,每次插入一个记录后,都调用show函数打印出当前的排序结果,方便查看。
这样,优化后的代码可以更加高效地完成直接插入排序算法,并且可以更加清晰地展示算法执行的过程。
阅读全文