数据结构---实现给定数组的快速排序

简介: 数据结构---实现给定数组的快速排序

实现给定数组的快速排序

题目描述

内容要求:

  1. 以菜单的形式作为用户界面,接收待排序的输入序列,使用快速排序的方法对输入序列进行快速排序。
  2. 测试数据:
    80,43,18,21,30,13,52,51,75

题目分析

快速排序是通过递归或非递归实现的,其中对于单趟PartSort也有三种不同的算法,这三种不同的算法效率没有差异,通常是通过递归实现快速排序,非递归需要借助栈或队列,这里展示的是递归版、前后指针法实现快速排序,如果有其他需求可以看此文章自行寻找所需算法

数据结构---手撕图解排序(含动图演示)

#include <stdio.h>
#include <stdlib.h>

void PrintArrey(int* a, int n)
{
   
    for (int i = 0; i < n; i++)
    {
   
        printf("%d ", a[i]);
    }
    printf("\n");
}

void Swap(int* a, int* b)
{
   
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int PartSort(int* a, int left, int right)
{
   
    int cur = left + 1;
    int prev = left;
    int keyi = left;
    while (cur <= right)
    {
   
        if (a[cur] < a[keyi])
        {
   
            ++prev;
            Swap(&a[prev], &a[cur]);
        }
        cur++;
    }

    Swap(&a[prev], &a[keyi]);

    return prev;
}


void QuickSort(int* a, int begin, int end)
{
   
    if (begin >= end)
    {
   
        return;
    }
    int keyi = PartSort(a, begin, end);

    QuickSort(a, begin, keyi - 1);
    QuickSort(a, keyi + 1, end);
}

void menu()
{
   
    printf("*****************************\n");
    printf("********* 1. Sort **********\n");
    printf("********* 0. exit  **********\n");
    printf("*****************************\n");
}

void CheckCapacity(int* a, int num, int* capacity)
{
   
    if (num > *capacity)
    {
   
        int* tmp = (int*)realloc(a, sizeof(int) * num);
        if (tmp == NULL)
        {
   
            perror("realloc fail");
            return;
        }
        a = tmp;
        *capacity = num;
    }
    else
    {
   
        return;
    }
}

void Sort()
{
   
    int capacity = 10;
    int* a = (int*)malloc(sizeof(int) * capacity);
    if (a == NULL)
    {
   
        perror("malloc fail");
        return;
    }
    int num;
    printf("输入要输入元素的个数->");
    scanf("%d", &num);
    CheckCapacity(a, num, &capacity);
    printf("输入对应个数的元素->");
    for (int i = 0; i < num; i++)
    {
   
        scanf("%d", &a[i]);
    }
    QuickSort(a, 0, num - 1);
    printf("排序完成:\n");
    PrintArrey(a, num);
    free(a);
    a = NULL;
}

int main()
{
   
    int input = 0;
    do
    {
   
        menu();
        scanf("%d", &input);
        switch (input)
        {
   
        case 1:
            Sort();
            break;
        case 0:
            break;
        default:
            printf("输入错误 重新输入\n");
        }
    } while (input);
}
相关文章
|
11月前
|
存储 Java 程序员
数据结构之 - 深入了解数组数据结构
数据结构之 - 深入了解数组数据结构
148 6
|
5月前
|
算法 搜索推荐
快速排序-数据结构与算法
快速排序(Quick Sort)是一种基于分治法的高效排序算法。其核心思想是通过选择基准(pivot),将数组划分为左右两部分,使得左侧元素均小于基准,右侧元素均大于基准,然后递归地对左右两部分进行排序。时间复杂度平均为 O(n log n),最坏情况下为 O(n²)(如数组已有序)。空间复杂度为 O(1),属于原地排序,但稳定性不佳。 实现步骤包括编写 `partition` 核心逻辑、递归调用的 `quickSort` 和辅助函数 `swap`。优化方法有随机化基准和三数取中法,以减少最坏情况的发生。
267 13
|
7月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
264 23
|
8月前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
193 7
|
11月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
314 64
|
10月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
262 5
|
10月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
194 4
|
11月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
170 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
11月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
276 1
|
11月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
120 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列