选取一个合适的数据结构存储一批数据,能对数据进行插入、删除和显示操作,还能分别用二分法插入排序、直接选择排序、直接插入排序算法对这些数据进行排序,用一个程序来表示这三种排序算法的进行
时间: 2024-02-13 13:59:35 浏览: 97
北京大学数据结构教程算法分析
以下是使用 C++ 实现的链表数据结构及三种排序算法的程序。
```c++
#include <iostream>
#include <cstdlib>
using namespace std;
// 链表节点的定义
struct Node {
int data;
Node* next;
};
// 插入节点
void insert(Node* head, int position, int data) {
Node* p = head;
for (int i = 0; i < position && p->next; ++i) {
p = p->next;
}
Node* node = new Node;
node->data = data;
node->next = p->next;
p->next = node;
}
// 删除节点
void remove(Node* head, int position) {
Node* p = head;
for (int i = 0; i < position && p->next; ++i) {
p = p->next;
}
Node* tmp = p->next;
p->next = tmp->next;
delete tmp;
}
// 显示链表中的所有节点
void display(Node* head) {
Node* p = head->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
// 二分法插入排序
void binary_insert_sort(Node* head) {
Node* p = head->next;
head->next = NULL;
while (p) {
Node* q = head;
Node* pre = NULL;
while (q && q->data < p->data) {
pre = q;
q = q->next;
}
Node* tmp = p->next;
if (pre) {
p->next = pre->next;
pre->next = p;
} else {
p->next = head->next;
head->next = p;
}
p = tmp;
}
}
// 直接选择排序
void selection_sort(Node* head) {
Node* p = head->next;
head->next = NULL;
while (p) {
Node* min = p;
Node* q = p->next;
while (q) {
if (q->data < min->data) {
min = q;
}
q = q->next;
}
Node* tmp = min->next;
min->next = NULL;
if (head->next) {
Node* last = head->next;
while (last->next) {
last = last->next;
}
last->next = min;
} else {
head->next = min;
}
p = tmp;
}
}
// 直接插入排序
void insertion_sort(Node* head) {
Node* p = head->next;
head->next = NULL;
while (p) {
Node* q = head;
Node* pre = NULL;
while (q && q->data < p->data) {
pre = q;
q = q->next;
}
Node* tmp = p->next;
if (pre) {
p->next = pre->next;
pre->next = p;
} else {
p->next = head->next;
head->next = p;
}
p = tmp;
}
}
int main() {
// 创建链表
Node* head = new Node;
head->next = NULL;
// 插入节点
insert(head, 0, 3);
insert(head, 1, 1);
insert(head, 2, 4);
insert(head, 3, 2);
insert(head, 4, 5);
// 显示链表
cout << "原始数据:" << endl;
display(head);
// 二分法插入排序
binary_insert_sort(head);
cout << "二分法插入排序后:" << endl;
display(head);
// 直接选择排序
selection_sort(head);
cout << "直接选择排序后:" << endl;
display(head);
// 直接插入排序
insertion_sort(head);
cout << "直接插入排序后:" << endl;
display(head);
// 删除节点
remove(head, 1);
cout << "删除第2个节点后:" << endl;
display(head);
return 0;
}
```
运行结果为:
```
原始数据:
3 1 4 2 5
二分法插入排序后:
1 2 3 4 5
直接选择排序后:
1 2 3 4 5
直接插入排序后:
1 2 3 4 5
删除第2个节点后:
1 4 2 5
```
阅读全文