C++ 排序

#include<iostream>
using namespace std;
#include<ctime>
#include<cstdlib>
typedef int KeyType;
typedef char * InfoType;
typedef struct
{
    KeyType key;
    InfoType otherinfo;
}ElemType;
typedef struct
{
    ElemType *R;
    int length;
}SqList;

int CmpNum0;
int CmpNum1;
int CmpNum2;
int CmpNum3;

void CreateList(SqList &L,int n)
{
    int i;
    L.R=new ElemType[n+1];
    srand(time(0));
    for(i=1;i<=n;i++)
    {
        L.R[i].key=rand()%100;    
    }
    L.length=n;
}

void ListTraverse(SqList L)
{
    int i;
    for(i=1;i<=L.length;i++)
        cout<<L.R[i].key<<‘\t‘;
    cout<<endl;
}

void BubbleSort(SqList &L)
{
    int m,flag,i;
    m=L.length-1;flag=1;
    while(m>0&&flag)
    {
        flag=0;
        for(i=1;i<=m;i++)
        {
            CmpNum0++;
            if(L.R[i].key>L.R[i+1].key)
            {
                flag=1;
                L.R[0]=L.R[i+1];
                L.R[i+1]=L.R[i];
                L.R[i]=L.R[0];
            }
        }
        m--;
    }
}

void InsertSort(SqList &L)
{    //对顺序表L做直接插入排序
        int i,j;
        for(i=2;i<=L.length;++i)
        {
            CmpNum1++;
            if(L.R[i-1].key>L.R[i].key)       //">"需将R[i]插入有序子表
            
            {
                L.R[0]=L.R[i];        //将待插入的记录暂存到监视哨中
                L.R[i]=L.R[i-1];      //R[i-1]后移
                for(j=i-2;L.R[0].key<L.R[j].key;--j)   //从后面向前寻找插入位置
                    L.R[j+1]=L.R[j];      //记录逐个后移,直到找到插入位置
                L.R[j+1]=L.R[0];      //将R[0]即原R[i],插入到正确位置
            }
        }
}

void BInsertSort(SqList &L)
{      //对顺序表L做折半插入排序
        int i,j,low,high,m;
        for(i=2;i<=L.length;++i)
        {
            CmpNum2++;
            L.R[0]=L.R[i];          //将待插入的记录暂存到监视哨中
            low=1;high=i-1;        //置查找区间初值
            while(low<=high)       //在R[low...high]中折半查找插入的位置
            {
                m=(low+high)/2;     //折半
                if(L.R[m].key>L.R[0].key) high=m-1;   //插入点在前一子表
                else low=m+1;    //插入点在后一子表
                
            }
            for(j=i-1;j>=high+1;--j)    
                L.R[j+1]=L.R[j];          //记录后移 
            L.R[high+1]=L.R[0];        //将R[0]即原R[i],插入到正确位置
        }
}

int main()
{
    SqList L;
    CreateList(L,8);
    cout<<"测试数据:"<<endl;
    ListTraverse(L);
    BubbleSort(L);
    cout<<"排序后:"<<endl;
    ListTraverse(L);
    cout<<"BubbleSort排序方法中数据的比较次数为:"<<CmpNum0<<endl;
  InsertSort(L);
    cout<<"排序后:"<<endl;
    ListTraverse(L);
    cout<<"InsertSort排序方法中数据的比较次数为:"<<CmpNum1<<endl;
    BInsertSort(L);
    cout<<"排序后:"<<endl;
    ListTraverse(L);
    cout<<"BInsertSort排序方法中数据的比较次数为:"<<CmpNum2<<endl;
    return 0;
}

时间: 2024-08-24 09:47:23

C++ 排序的相关文章

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 程序实现: import java.util.Scanner; public class Test38 { public static void main(String[] args) { /**  * 初始化数组,测试数据可以多种途径初始化  */   Scanner in = new Scanner(System.in); /*int[] a = 

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

C/C++算法竞赛入门经典Page11 例题1-5 三整数排序

题目:输入3个整数,从小到大排序后输出 样例输入: 20 7 33 样例输出: 7 20 33 首先,先声明三个整数a,b,c和一个临时变量t: int a,b,c,t;//1,b,c为三个整数,t为临时变量 输入三个整数: scanf("%d%d%d",&a,&b,&c); 进行3次if判断: 1.如果b>a,则a,b对调 2.如果c>a,则a,c对调 3.如果c>b,则b,c对调 代码: if(b>=a){ t=b; b=a; a=t

排序与查找

1.冒泡法排序 2.选择排序 3.二分法查找(有序数组) 4.无序数组(基本查找)

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用.Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询.分页.排序.复选框.设置显示列.Card view视图.主从表显示.合并列.国际化处理等处理功能,而且该插件同时也提供了一些不错的扩展功能,如移动行.移动列位置等一些特殊的功能,插件可

AC日记——双栈排序 洛谷 P1155

双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define maxm 2000005 int n,head[maxn],E[maxm],V[maxm],cnt,col[maxn]; int minn[maxn],ai[maxn],sta1[maxn],sta2[maxn],top1,top2; bool if_[maxn][maxn]; inline void in(

输入password登录到主界面,录入学生编号,排序后输出

n 题目:输入password登录到主界面,录入学生编号,排序后输出 n 1.  语言和环境 A.实现语言 C语言 B.环境要求 VC++ 6.0 n 2.  要求 请编写一个C语言程序.将若干学生编号按字母顺序(由小到大)输出. 程序的功能要求例如以下: 1)  输入password"admin",正确则进入主界面,错误则直接推出(exit(0)): 2)从键盘输入5个学生编号"BJS1001","BJS2001"."BJS1011&