排序-陈越

这篇博客探讨了五种不同的排序算法——冒泡排序、快速排序、直接插入排序、希尔排序和选择排序,并提供了C++代码实现。通过测试不同数据集(包括随机数、有序数、逆序数等)来展示各种算法在性能上的表现。

给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。
输入格式:

输入第一行给出正整数N(≤10
​5
​​ ),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

输出格式:

在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例:

11
4 981 10 -17 0 -20 29 50 8 43 -5
输出样例:

-20 -17 -5 0 4 8 10 29 43 50 981

代码如下:
#include
#include
using namespace std;
void sort1(long a[],int N){
for (int j = N - 1; j > 0; --j)
{
bool noChange = true;
for (int i = 0; i < j; ++i)
{
if (a[i] > a[i + 1])
{
swap(a[i], a[i + 1]);
noChange = false;
}
}
if (noChange)
break;
}
}

void sort2(long a[], int start,int end) {
if (start < end) { <

### 冒泡排序链表实现代码补全 以下是冒泡排序在链表上的完整实现代码,基于提供的结构体定义和函数框架[^1]: ```c typedef struct node *nodeptr; struct node { int value; nodeptr next; /* 一些其他的项,在此忽略 */ }; nodeptr BubbleSort(nodeptr h) { /* h 是带空头结点的链表的头指针 */ nodeptr p, q; int flag_swap; if (!h->next) return h; // 如果链表为空或只有一个节点,则直接返回 do { flag_swap = 0; p = h; while (p->next && p->next->next) { // 确保当前节点和下一个节点都存在 if (p->next->value > p->next->next->value) { // 如果相邻两节点值顺序不对 flag_swap = 1; // 标记发生了交换 q = p->next; // 记录需要交换的节点 p->next = q->next; // 调整指针完成交换 q->next = p->next->next; p->next->next = q; } p = p->next; // 移动到下一个节点 } } while (flag_swap); // 如果本轮有交换发生,则继续下一轮 return h; // 返回排序后的链表头指针 } ``` ### 代码解析 上述代码实现了链表的冒泡排序算法。具体来说: - 使用了一个外部循环 `do-while` 来控制多轮扫描,直到没有元素需要交换为止。 - 内部循环 `while` 遍历链表中的每个节点对,检查是否需要交换相邻节点。 - 每次交换通过调整节点指针完成,而不是直接交换节点值,这符合链表操作的特点[^1]。 ### 注意事项 在实现过程中需要注意以下几点: - 判断条件中必须确保 `p->next` 和 `p->next->next` 都不为空,以避免访问非法内存地址。 - 在每次交换后,需正确调整三个节点之间的指针关系,以保持链表的完整性[^1]。 ### 时间复杂度分析 对于长度为 N 的链表,冒泡排序的时间复杂度为 O(N^2),因为最坏情况下需要进行 N*(N-1)/2 次比较和可能的交换操作[^1]。然而,如果链表已经接近有序,冒泡排序可以通过提前终止来优化性能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值