26-数据结构-线性表2

🔧 常用顺序表算法与操作实现(含O(n)划分、逆置、回文、双向冒泡、二分查找、数组左移等)

本文整理了顺序表常见操作的 C/C++ 实现,包括划分操作、逆置与回文判断、递归二分查找、双向冒泡排序及数组循环左移,适合初学者学习掌握线性表基础操作。

1️⃣ 顺序表结构定义

复制代码
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100
struct SeqList {
    int data[MAX_SIZE];
    int length;
};

2️⃣ O(n) 划分算法(小于 key 的在左,大于 key 的在右)

复制代码
void spliceArray(struct SeqList *L, int key) {
    int left = 0;
    int right = L->length - 1;

    while (left <= right) {
        while (left <= right && L->data[left] < key)
            left++;
        while (left <= right && L->data[right] > key)
            right--;
        if (left <= right) {
            int tmp = L->data[left];
            L->data[left] = L->data[right];
            L->data[right] = tmp;
            left++;
            right--;
        }
    }
}

3️⃣ 数组逆置操作

复制代码
void reverseArray(int ar[], int n) {
    int i = 0, j = n - 1;
    while (i < j) {
        int tmp = ar[i];
        ar[i] = ar[j];
        ar[j] = tmp;
        i++;
        j--;
    }
}

4️⃣ 回文判断(正着读和反着读一致)

复制代码
bool isPalindrome(struct SeqList *L) {
    int i = 0, j = L->length - 1;
    while (i < j) {
        if (L->data[i] != L->data[j])
            return false;
        i++;
        j--;
    }
    return true;
}

5️⃣ 递归二分查找(需在有序表中)

复制代码
int binarySearch(struct SeqList *L, int left, int right, int target) {
    if (left > right)
        return -1;
    int mid = (left + right) / 2;
    if (L->data[mid] == target)
        return mid;
    else if (target < L->data[mid])
        return binarySearch(L, left, mid - 1, target);
    else
        return binarySearch(L, mid + 1, right, target);
}

6️⃣ 双向冒泡排序(鸡尾酒排序)

复制代码
void doubleBubbleSort(struct SeqList *L) {
    int left = 0;
    int right = L->length - 1;
    bool is_swap;

    do {
        is_swap = false;
        // 从左向右冒泡最大值
        for (int i = left; i < right; i++) {
            if (L->data[i] > L->data[i + 1]) {
                int tmp = L->data[i];
                L->data[i] = L->data[i + 1];
                L->data[i + 1] = tmp;
                is_swap = true;
            }
        }
        if (!is_swap) break;
        right--;

        is_swap = false;
        // 从右向左冒泡最小值
        for (int j = right; j > left; j--) {
            if (L->data[j] < L->data[j - 1]) {
                int tmp = L->data[j];
                L->data[j] = L->data[j - 1];
                L->data[j - 1] = tmp;
                is_swap = true;
            }
        }
        left++;
    } while (is_swap);
}

7️⃣ 数组循环左移 p 位(高效方法)

复制代码
void reverseSection(int ar[], int left, int right) {
    while (left < right) {
        int tmp = ar[left];
        ar[left] = ar[right];
        ar[right] = tmp;
        left++;
        right--;
    }
}

void rotateLeft(int ar[], int n, int p) {
    if (n <= 1 || p <= 0 || p >= n)
        return;
    p = p % n;
    reverseSection(ar, 0, n - 1);       // 整体反转
    reverseSection(ar, 0, n - p - 1);   // 反转前 n-p 部分
    reverseSection(ar, n - p, n - 1);   // 反转后 p 部分
}

🔚 总结

本文涵盖的内容包括:

  • 顺序表划分(快排思想);

  • 数组逆置与回文判断;

  • 递归二分查找;

  • 双向冒泡排序;

  • 高效数组循环左移。

这些算法是常见的基本题型,也是数据结构与算法入门的基础内容,建议每个模块都亲手敲一遍。

相关推荐
间歇性努力持续性发呆的野生快乐选手16 分钟前
栈的性质(进栈,出栈,访问)
数据结构·c++
m0_5474866632 分钟前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
xiaohaiAIgeo37 分钟前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
旖旎夜光43 分钟前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
小强库计算机毕业设计1 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质1 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军1 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐1 小时前
maven部分构建参数讲解
java·maven
ZC跨境爬虫1 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
kisbad2 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript