[NEFU锐格 数据结构]实验八 排序表有关的操作

Posted 鱼竿钓鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NEFU锐格 数据结构]实验八 排序表有关的操作相关的知识,希望对你有一定的参考价值。

[NEFU锐格 数据结构]实验八 排序表有关的操作

正经人谁手写排序啊,无脑sort冲冲冲。
如果阶段考上机排序,sort直接乱杀,可惜排不得。
推荐阅读:[数据结构]NEFU 大二上 锐格实验参考 目录

扯犊子Time

锐格 数据结构系列应该就此完结了,排序算法大家基本都学过,所以来波闲谈,如果单纯看答案就直接跳过吧,或许会影响你一天的心情awa。

关于提问:
问东西之前,自己去搜索引擎搜过,尝试过自己的解决方案是基本要求吧。搜一下就有的东西,再来麻烦别人,这不是浪费别人时间吗。如果你没有付出过努力就来麻烦别人,那么我会考虑下面两种情况:你是一个懒狗或者你的重点在交流而不在于解决问题。

我个人对于这些情况的解决方案取决于:我的时间,我的心情,以及对方在我心中的权重。
如果我不认识你,你还问了个很憨憨的问题,那我大概会无视你吧。

关于称呼:
个人不太喜欢别人给我加什么称呼,不管你是赞美还是拿我打趣。我本来就没有什么特别深的人际关系,无聊的称呼只会加深你我的隔阂,让我倍感孤独。熟人无需称呼直接说事,生人同学相称即可。

关于阶段考:
如果你有自己规划和准备,那这可能是你的阻碍,应付应付就完事了。(冲保研的同学除外)
如果你没有自己规划,那阶段考帮你兜底的,没了这兜底可能会变得很烂吧,安安心心学就万事了。

题目

8550

堆排序,懒得手写堆了,直接C++ STL的priority_queue优先队列,可以认为他是堆,字面意思就是有顺序的队列嘛,肯定排过顺序

#include<iostream>
#include<queue>
#include<vector>
using namespace std;

int main(){
    priority_queue<int,vector<int>,greater<int>>heap;
    int x;while(cin>>x&&x)heap.push(x);
    while(!heap.empty()){cout<<heap.top()<<" ",heap.pop();}
    return 0;
}

8549

经典快排,找工作挺有用的,建议不会也给背下来

#include<algorithm>
#include<cstdio>

using namespace std;

const int N=1e5+5;
int q[N];
void quick_sort(int q[],int l,int r)
{
    if(l>=r)return;
    int i=l-1,j=r+1,x=q[l+r+1>>1];
    while(i<j)
    {
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j)swap(q[i],q[j]);
    }
    quick_sort(q,l,i - 1),quick_sort(q,i,r);
}

int main()
{
    int n=0,x;
    while(~scanf("%d",&x)&&x)q[++n]=x;
    quick_sort(q,1,n);
    for(int i=1;i<=n;i++)printf("%d ",q[i]);
}

8548

简单选择排序

#include <stdio.h>
void Sort(int a[],int n){
    for(int i=0; i<n-1; i++){
        int min_index = i; 
        for(int j=i+1; j<n; j++)
            if(a[j] < a[min_index])
                min_index = j;
        
        if( i != min_index){
            int temp = a[i];
            a[i] = a[min_index];
            a[min_index] = temp;
        }
    }
}

int A[105];
int n,x;
int main() {
	while(~scanf("%d",&x)&&x)A[n++]=x;
	Sort(A,n);
	for(int i=0;i<n;i++)printf("%d ",A[i]);
	return 0;
}

8547

希尔排序,优化的插入排序嘛

#include <stdio.h>
void Sort(int a[], int len){
    int i, j, k, tmp, gap;  // gap 为步长
    for (gap = len / 2; gap > 0; gap /= 2) {  // 步长初始化为数组长度的一半,每次遍历后步长减半,
    	for (i = 0; i < gap; ++i) { // 变量 i 为每次分组的第一个元素下标 
	        for (j = i + gap; j < len; j += gap) { //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
	            tmp = a[j];  // 备份a[j]的值
	            k = j - gap;  // j初始化为i的前一个元素(与i相差gap长度)
	            while (k >= 0 && a[k] > tmp) {
	                a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
	                k -= gap;
	            }
	            a[k + gap] = tmp; 
	        }
	    }
    }
}


int A[105];
int n,x;
int main() {
	while(~scanf("%d",&x)&&x)A[n++]=x;
	Sort(A,n);
	for(int i=0;i<n;i++)printf("%d ",A[i]);
	return 0;
}

8546

冒泡排序

#include <stdio.h>
void Sort(int arr[], int n) {
    int temp;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n - i - 1; ++j) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
int A[105];
int n,x;
int main() {
	while(~scanf("%d",&x)&&x)A[n++]=x;
	Sort(A,n);
	for(int i=0;i<n;i++)printf("%d ",A[i]);
	return 0;
}

8545

直接插入排序

#include <stdio.h>
int InsertSort(int A[], int n) {
	for(int i=2; i<=n; i++) { 
		A[0]=A[i];
        int j; 
		for(j=i-1; A[0]<A[j]; j--)A[j+1]=A[j];
		A[j+1]=A[0];
	}
	return 0;
}
int A[105];
int n,x;
int main() {
	while(~scanf("%d",&x)&&x)A[++n]=x;
	InsertSort(A,n);
	for(int i=1;i<=n;i++)printf("%d ",A[i]);
	return 0;
}

以上是关于[NEFU锐格 数据结构]实验八 排序表有关的操作的主要内容,如果未能解决你的问题,请参考以下文章

[NEFU锐格 数据结构]实验一 线性表有关的操作

[NEFU锐格 数据结构]实验二 栈和队列有关的操作

[NEFU锐格 数据结构]实验七 查找有关的操作

[NEFU锐格 数据结构]实验三四 二叉树常见的操作

[JAVA] NEFU 大二下锐格 目录

[NEFU数据结构]阶段一往年卷子以及参考答案