首页 > 其他分享 >冒泡排序+快速排序+插入排序(实现)

冒泡排序+快速排序+插入排序(实现)

时间:2023-02-01 23:14:03浏览次数:44  
标签:38 58 ElemType 插入排序 35 63 冒泡排序 排序 65

王道督学营16

/*
Description
读取10个整型数据12 63 58 95 41 35 65  0 38 44,然后通过冒泡排序,快速排序,插入排序,分别对该组数据进行排序,输出3次有序结果,每个数的输出占3个空格

Input
12 63 58 95 41 35 65  0 38 44

Output
输出3次有序结果

0 12 35 38 41 44 58 63 65 95
0 12 35 38 41 44 58 63 65 95
0 12 35 38 41 44 58 63 65 95

Sample Input 1

12 63 58 95 41 35 65  0 38 44
Sample Output 1
  0 12 35 38 41 44 58 63 65 95
  0 12 35 38 41 44 58 63 65 95
  0 12 35 38 41 44 58 63 65 95
 */
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
typedef int ElemType;
typedef struct{
    ElemType *elem;
    int len;
}SSTable;
//交换两数据的值
void swap(ElemType &a,ElemType &b)
{
    ElemType temp=a;
    a=b;
    b=temp;
}
//表初始化,随机元素
void ST_Init(SSTable &T,int len)
{
    srand(time(NULL));
    T.elem=(ElemType*) malloc(len*sizeof (ElemType));
    T.len=len;
    for(int i=0;i<T.len;i++)
    {
        T.elem[i]=rand()%100;
    }
}
//表初始化,读取元素
void ST_Scanf(SSTable T,int len)
{
    for(int i=0;i<T.len;i++)
    {//读取10个值
        scanf("%d",&T.elem[i]);
    }
}
//输出表元素
void ST_Print(SSTable T)
{
    for(int i=0;i<T.len;i++)
    {
        printf("%3d",T.elem[i]);
    }
    printf("\n");
}
//冒泡排序,len为表长
void BubbleSort(ElemType A[],int len)
{
    for(int i=0;i<len-1;i++)
    {//每趟的左端点逐渐变小
        bool flag= true;//指示是否有序
        for(int j=len-1;j>i;j--)
        {//从后向前
            if(A[j-1]>A[j])
            {
                swap(A[j],A[j-1]);
                flag= false;//有交换,表示无序
            }
        }
        if(flag)//没有交换,说明有序,直接结束
        {
            return;
        }
    }
}
//快速排序,依赖函数,分割函数,以第一个元素为基准,将表分为两部分,返回中间下标
int Partition(ElemType A[],int low,int high)
{
    ElemType mid=A[low];//分割基准
    int i=low,j=high;//两端指针
    while (i<j)
    {
        //从后向前,找小的
        while(A[j]>=mid&&i<j)
            j--;
        A[i]=A[j];
        //从前向后,找大的
        while(A[i]<=mid&&i<j)
            i++;
        A[j]=A[i];
    }//此时i==j
    //printf("i=%d,j=%d\n",i,j);
    A[i]=mid;
    return i;
}
//快速排序,low为起点下标,high为终点下标
void QuickSort(ElemType A[],int low,int high)
{
    if(low<high)
    {
        int pivot=Partition(A,low,high);
        QuickSort(A,low,pivot-1);
        QuickSort(A,pivot+1,high);
    }
}
//插入排序,len为表长
void InsertSort(ElemType A[],int len)
{//插入排序
    for(int i=1;i<len;i++)//要插入的元素的下标
    {
        int val=A[i];
        int j;
        for(j=i-1;j>=0;j--)//将val与前面的元素值比较
        {
            if(val<A[j])//不符合条件,则后移
                A[j+1]=A[j];
            else
                break;
        }
        A[j+1]=val;//要插入的位置在j后面一格
    }
}
void Sort1()
{//冒泡排序
    SSTable T;
    ST_Init(T,10);
    ST_Scanf(T,T.len);
    BubbleSort(T.elem,10);
    ST_Print(T);
}
void Sort2()
{//快速排序
    SSTable T;
    ST_Init(T,10);
    ST_Scanf(T,T.len);
    QuickSort(T.elem,0,9);
    ST_Print(T);
}
void Sort3()
{//插入排序
    SSTable T;
    ST_Init(T,10);
    ST_Scanf(T,T.len);
    InsertSort(T.elem,10);
    ST_Print(T);
}
int main() {
    SSTable T1,T2,T3;
    ST_Init(T1,10);
    ST_Init(T2,10);
    ST_Init(T3,10);
    for(int i=0;i<10;i++)
    {
        ElemType temp;
        scanf("%d",&temp);
        T1.elem[i]=temp;
        T2.elem[i]=temp;
        T3.elem[i]=temp;
    }
    BubbleSort(T1.elem,T1.len);
    ST_Print(T1);
    QuickSort(T2.elem,0,9);
    ST_Print(T2);
    InsertSort(T3.elem,T3.len);
    ST_Print(T3);

    return 0;
}

 

标签:38,58,ElemType,插入排序,35,63,冒泡排序,排序,65
From: https://www.cnblogs.com/FishSmallWorld/p/17084434.html

相关文章

  • P1177 【模板】快速排序
    这次没有题目水字数了,记录一个很棒的快速排序模板!!voidQsort(intbeg,intend){ intmid=str[(beg+end)/2]; inti=beg,j=end; do{ while(str[i]<m......
  • 排序算法
    排序算法排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。......
  • NOI2022冒泡排序
    首先考虑A性质的点。区间最小值为\(1\)的限制等价于要求区间所有值为\(1\)。另外一种限制等价于区间不全为\(1\)。把一定是\(1\)的做一个区间覆盖。其他部分暂且......
  • 堆排序(Heap Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 计数排序(Counting Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 基数排序(Radix Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 桶排序(Bucket Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 希尔排序(Shell Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 快速排序(Quick Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 归并排序(Merge Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......