数据结构与算法——实验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编辑

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

心得体会

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

相关文章
|
8天前
|
存储 机器学习/深度学习 算法
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
17 1
|
14天前
|
算法 数据处理 C语言
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
|
21天前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
23 4
|
23天前
|
搜索推荐 算法 编译器
【数据结构】八大排序之快速排序算法
【数据结构】八大排序之快速排序算法
35 4
|
1月前
|
搜索推荐
数据结构——排序算法之快速排序
数据结构——排序算法之快速排序
33 0
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--快速排序
数据结构与算法(Java篇)笔记--快速排序
|
1月前
|
算法 C语言
【数据结构】快速排序(4种方式实现)
【数据结构】快速排序(4种方式实现)
|
1月前
|
搜索推荐 JavaScript
NodeJS实现快速排序算法
NodeJS实现快速排序算法
14 0
|
1月前
|
搜索推荐
排序算法-快速排序
排序算法-快速排序
17 0