数据结构排序算法(简单选择、快速、折半插入法排序)

目录

1、简单选择排序

2、快速排序

3、折半插入排序

4、数据分析

5、源码解析

1、简单选择排序

//简单选择排序
void selection_sort(zstu &S,int sum){
		bool desc;
		cout<<"请输入排序的方式(1为从高到低反之0....):"<<endl;
		cin>>desc; 
      for(int i=0;i<sum-1;i++){
	    for(int j=i+1;j<sum;j++){
		if((desc&&S.snode[j]->grade>S.snode[i]->grade)||(!desc&&S.snode[j]->grade<S.snode[i]->grade)){
                 	stu* temp=S.snode[i];
                	S.snode[i]=S.snode[j];
			     	S.snode[j]=temp;
		  }
	   }	
	}
} 

2、快速排序

//快速排序
int partition(zstu &S,int low,int high){
	stu* val = S.snode[low];
	while(low<high){
	 if(S.snode[high]->grade>val->grade){
	 	high--;
	 }
	  S.snode[low]=S.snode[high];
	  
      if(S.snode[low]->grade<val->grade){
	 	low++;
	 }
	  S.snode[high]=S.snode[low];
	 }
	S.snode[low]=val;
		return low;
}

void QSort(zstu &S,int low,int high){
	if(low<high){
		//保存第一个位置的数据到stu*val中 
		stu* val = S.snode[low];
		
		int pos=partition(S,low,high);
		S.snode[pos] = val; 
		//将val插入后继续递归其右边的数据 
		QSort(S,low,pos-1);
		//递归实现其左边的数据 
		QSort(S,pos+1,high);
	}
}

3、折半插入排序

//折半插入法排序
 void binary_insertion_sort(zstu &S, int len, bool desc) {
    for (int i = 1; i <=len; i++) {
        stu*key = S.snode[i];
        int low = 0, high = i-1;
        while (low <= high) {
            int mid = (low + high) / 2;
            if ((desc&&S.snode[mid]->grade<key->grade)||(!desc&&S.snode[mid]->grade>key->grade)) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        for (int j = i-1; j >= high+1; j--) {
            S.snode[j+1] = S.snode[j];
        }
        S.snode[high+1] =key;
    }
}

4、数据分析

1、输入的形式和输出值的范围;

输入的形式:将学生的姓名及成绩输入到一个结构体数组中输出值的范围:学生成绩的范围是int型的。

(1)输出的形式;将三种排序的结果一并输出。(2)程序所能达到的功能;实现简单选择排序功能;实现快速排序功能;实现折半插入排序功能。(3)测试数据:包括正确的输入输出结果和错误的输入及输出结果。

2、主程序的流程及各程序模块之间的调用关系。

(1)根据实验内容确定需要实现的全部函数。

Gradestroage(zstu &S):存储学生信息的函数;

selection_sort(zstu &S,int sum):简单选择排序;

partition(zstu &S,int low,int high):找到 第一个被保存到stu*val中的数据的位置(右边的都比此数小左边都比此数大)并返回此位置

QSort(zstu &S,int low,int high):执行递归函数进行快速排序的相关操作;

相关代码实现:

void QSort(zstu &S,int low,int high){

if(low<high){

//保存第一个位置的数据到stu*val中

stu* val = S.snode[low];

int pos=partition(S,low,high);

S.snode[pos] = val;

//将val插入后继续递归其右边的数据

QSort(S,low,pos-1);

//递归实现其左边的数据

QSort(S,pos+1,high);

}

}

binary_insertion_sort(zstu &S, int len, bool desc):折半插入排序的算法实现

3、程序中函数调用流程图:

5、源码解析

#include<iostream>
#include<stdlib.h>
#include<string>
#include<stdio.h>
#include<stdbool.h>
#include<windows.h>
#define OK 1
#define m 30
using namespace std;
typedef struct Student{
	string name;
	int grade;
}stu; 
typedef struct S{
	stu *snode[m]; 
}zstu;
//学生数据存储 
static int sum=0;
void Gradestroage(zstu &S){
	cout<<"请输入学生总人数"<<endl;
	cin>>sum;
	system("cls");
     for(int i=0;i<sum;i++){ 
	 cout<<"请输入学生的姓名及成绩:"<<endl;
     	stu *S1=new stu;
     	cin>>S1->name>>S1->grade; 
     	S.snode[i]=S1;
	 }
}
//简单选择排序
void selection_sort(zstu &S,int sum){
		bool desc;
		cout<<"请输入排序的方式(1为从高到低反之0....):"<<endl;
		cin>>desc; 
      for(int i=0;i<sum-1;i++){
	    for(int j=i+1;j<sum;j++){
		if((desc&&S.snode[j]->grade>S.snode[i]->grade)||(!desc&&S.snode[j]->grade<S.snode[i]->grade)){
                 	stu* temp=S.snode[i];
                	S.snode[i]=S.snode[j];
			     	S.snode[j]=temp;
		  }
	   }	
	}
} 
//快速排序
int partition(zstu &S,int low,int high){
	stu* val = S.snode[low];
	while(low<high){
	 if(S.snode[high]->grade>val->grade){
	 	high--;
	 }
	  S.snode[low]=S.snode[high];
	  
      if(S.snode[low]->grade<val->grade){
	 	low++;
	 }
	  S.snode[high]=S.snode[low];
	 }
	S.snode[low]=val;
		return low;
}

void QSort(zstu &S,int low,int high){
	if(low<high){
		stu* val = S.snode[low];
		
		int pos=partition(S,low,high);
		S.snode[pos] = val; 
		QSort(S,low,pos-1);
		QSort(S,pos+1,high);
	}
}

//折半插入法排序
 void binary_insertion_sort(zstu &S, int len, bool desc) {
    for (int i = 1; i <=len; i++) {
        stu*key = S.snode[i];
        int low = 0, high = i-1;
        while (low <= high) {
            int mid = (low + high) / 2;
            if ((desc&&S.snode[mid]->grade<key->grade)||(!desc&&S.snode[mid]->grade>key->grade)) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        for (int j = i-1; j >= high+1; j--) {
            S.snode[j+1] = S.snode[j];
        }
        S.snode[high+1] =key;
    }
}
//遍历学生数据
void print(zstu &S){
	cout<<"学生信息如下:"<<endl;
	cout<<"姓名:"<<"\t"<<"成绩:"<<endl; 
	for(int i=0;i<sum;i++){
	cout<<S.snode[i]->name<<"\t"<<S.snode[i]->grade<<endl; 
	}
}

int main(){
	zstu z;
	Gradestroage(z);
	system("cls");
	cout<<"**************选择排序**************"<<endl;  
	selection_sort(z,sum);
    print(z);
    cout<<"**************快速排序**************"<<endl; 
    QSort(z,0,sum-1);
    print(z);
    cout<<"************折半插入排序************"<<endl; 
    binary_insertion_sort(z,sum-1,1);
    print(z);
	return 0;
} 

博主制作文章需要付出巨大的努力和心血制作不易!!如果对你有帮助的话 不妨点个赞噢!
博主渴望读者的关注和赞赏,因为这是对他们辛勤工作的最好认可和鼓励。

博主希望读者能够欣赏他们的专业知识和独到见解,同时也希望读者能够积极参与讨论,分享自己的看法和经验。
无论是通过点赞、评论还是分享,读者的支持对于博主们来说都是极为重要的。这些肯定和鼓励将激励博主们更加努力地创作出更多有价值的内容,为读者提供实用的技术指导和行业见解。
所以,如果你喜欢博主的文章,不妨给他们一点关注和赞赏吧!你的支持将成为他们创作的动力,也会让他们更加热情地为你带来更多精彩的内容。

————————————————
版权声明:本文为CSDN博主「峰屹小奕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_73620832/article/details/134070090

 

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值