数据结构与算法——实验4 快速排序

简介: 排序就是把一组元素按照某个域的值的递增或递减的次序重新排列的过程。快速排序在待排序记录序列中任取一个记录作为枢轴,以它作为比较的“基准”,将待排序划分为左右两个子序列,使行左边子序列中记录的关键字均小于等于枢轴,右边子序列中各记录的关键字都大于等于枢轴。对所划分的两组分别重复上述过程,直到各个序列的记录个数为1时为止。快速排序函数原型QuickSort(SeqList sq)。进阶选项:设计一个算法,在顺序表存储结构上实现快速排序。排序数据为学生的考试成绩单。成绩单由学生的学号、姓名和成绩组成,设计一

实验目的

    1 在掌握各种排序算法思想及实现的基础上,完成快速排序算法程序设计。

2 能够对排序算法进行基本的复杂度分析。

3. 加深对排序算法稳定性的理解。

实验重点

在掌握各种排序算法思想及实现的基础上,完成快速排序算法程序设计。

实验内容

排序就是把一组元素按照某个域的值的递增或递减的次序重新排列的过程。

快速排序

在待排序记录序列中任取一个记录作为枢轴,以它作为比较的“基准”,将待排序划分为左右两个子序列,使行左边子序列中记录的关键字均小于等于枢轴,右边子序列中各记录的关键字都大于等于枢轴。对所划分的两组分别重复上述过程,直到各个序列的记录个数为1时为止。快速排序函数原型QuickSort(SeqList sq)。

进阶选项:设计一个算法,在顺序表存储结构上实现快速排序。排序数据为学生的考试成绩单。成绩单由学生的学号、姓名和成绩组成,设计一个程序对给定的n个学生的成绩单按照名次列打印出每个学生的名次、学号、姓名和成绩。

实验提示:

算法实现:

#include "iostream.h"

#define MaxSize 100

typedef int DataType;

class CRecord

{

public:

int No;

string name;

int grade;

}

Typdef CRecord DataType;

class SeqList{

public:

CRecord * data;

int length;

}

//创建顺序表

Void SLCreat(SeqList  & sq);

{  CRecord x;

       length = 0;

cout <<"请输入数据元素数”;

cin>>sq.length;

sq.data= new CRecord[sq.length];

       cout <<"请输入数据元素值:  no, , name grade ";

       for(int i = 0;  i < n;  i++)

        {

cin >> sq.data[i].no>>sq .data[i].name>>sq. data[i]grade;

        }

}

//排序

Void Sort( SeqList & sq )

{  SLCreat(sq);

       QuickSort(sq,0,sq.length);

}

//快速排序

void  QuickSort(SeqList & sq, int low, int high)

{  int pos;

       if(low < high)

         {   pos = partition(sq,low, high);

              QuickSort(sq,low, pos-1);

              QuickSort(sq, pos+1, high);

       }

}

int  partition(SeqList & list, int i, int j)

{  DataType pivotkey;

       pivotkey = list[i];

       while(i < j)

        {  while(i < j&&list[j] >= pivotkey)   --j;

              if(i < j)  list[i++] = list[j];

              while(i < j&&list[i] <= pivotkey)  ++i;

              if(i < j)  list[j--] = list[i];

       }

      list[i] = pivotkeyl

      return  i;

}

//将顺序表显示在屏幕上

void SLPrint(SeqList & sq)

{

cout <<"快速排序结果: "’

for(int i = 0;  i <list.length;  i++)

              cout<<i<<sq.data[i].no<<sq .data[i].name<<sq. data[i].grade<<endl;

       cout << endl;

}

void main( )

{  SeqList myList;

       SLCreat(SeqList  &mylist);

       Sort(mylist );

       SLPrint( );

     }

程序流程图

image.gif编辑

程序代码

#pragma once
#include<stdio.h>
#include <iostream>
#include<string>
#include<stdlib.h>
using namespace std;
#define MaxSize 100
typedef int DataType;
class CRecord
{
public:
  int num;
  string name;
  int grade;
};
class SeqList {
public:
  CRecord* data;
  CRecord* temp;//作为枢轴记录
  int length;
};
//创建顺序表
void SLCreat(SeqList& sq)
{
  sq.length = 0;
  cout << "请输入数据元素数:";
  cin >> sq.length;
  cout << endl;
  sq.data = new CRecord[sq.length];
  sq.temp = new CRecord[sq.length];
  cout << "请输入数据元素值" << endl;
  cout << "学号 姓名 成绩:" << endl;
  for (int i = 0; i < sq.length; i++)
  {
    cin >> sq.data[i].num >> sq.data[i].name >> sq.data[i].grade;
  }
}
//快速排序
int  partition(SeqList& list, int i, int j)
{
  DataType pivotkey;
  list.temp[0] = list.data[i];
  pivotkey = list.data[i].grade;//枢轴关键字
  while (i < j)
  {
    while (i < j && list.data[j].grade >= pivotkey)--j;
    list.data[i] = list.data[j];
    while (i < j && list.data[i].grade <= pivotkey)++i;
    list.data[j] = list.data[i];
  }
  list.data[i] = list.temp[0];
  return  i;
}
void  QuickSort(SeqList& sq, int low, int high)
{
  int pos;
  if (low < high)
  {
    pos = partition(sq, low, high);
    QuickSort(sq, low, pos - 1);
    QuickSort(sq, pos + 1, high);
  }
}
void Sort(SeqList& sq)
{
  QuickSort(sq, 0, sq.length - 1);
}
//将顺序表显示在屏幕上
void SLPrint(SeqList& sq)
{
  cout << endl << "快速排序结果: " << endl;
  cout << "名次 学号  姓名  成绩" << endl;
  int n=1;
  for (int i = sq.length - 1; i >= 0; i--) {
    cout << n << "  " << sq.data[i].num << "  " << sq.data[i].name << " " << sq.data[i].grade << "  " << endl;
    n++;
  }
  cout << endl;
}
int main()
{
  SeqList myList;
  SLCreat(myList);
  Sort(myList);
  SLPrint(myList);
  return 0;
}

image.gif

运行结果及分析

image.gif编辑

输入数据元素数,将数据中每个元素进行输入,按学生成绩通过快速排序进行从小到大排列,最后打印名次成绩单。

心得体会

该实验通过对老师给的代码进行修改和完善,通过学习基本掌握了快速排序的用法,此次实验收获很多,对排序算法有了更深入的学习和了解。

相关文章
|
1月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
57 4
|
1月前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
44 4
|
1月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
52 4
|
1月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
41 4
|
1月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
54 4
|
1月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
57 4
|
23天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
115 61
|
1月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
81 4
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
51 4
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
147 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
下一篇
DataWorks