排序

一、实验目的与要求:
1、通过学习多种排序算法,体会对同一种操作多种不同的算法设计;通过比较各种排序算法对于数据存储结构的要求,体会算法设计不依赖于数据存储结构,而算法实现依赖于数据存储结构;通过分析排序算法的效率,研究如何进一步提高算法性能的方法。
2、要求掌握每种排序算法思路,算法描述,算法设计与算法实现手段,掌握排序算法时间复杂度和空间复杂度的分析方法,具有排序算法的设计能力。
二、任务描述:
1、编制程序实现插入排序
2、编制程序实现冒泡排序
3、编制程序实现快速排序

#include<iostream>
using namespace std;
#define Element int
const int DefaultSize=100;
class RecordList
{
public:
    Element *R;
    int MaxSize;//数组的大小
    int CurrentSize;//真实的元素的个数
    void Swap(Element &x,Element &y)
    {
        Element temp=x;x=y;y=temp;
    }
    RecordList(int MaxSz=DefaultSize)
    {
        R=new Element[MaxSz];
        MaxSize=MaxSz;
        CurrentSize=0;
    }
    //将元素e插入到顺序表的第i个元素之前
    void Insert(Element e,int i)
    {
        for(int j=CurrentSize-1;j>=i-1;j--)
        {
            R[j+1] = R[j];
        }
        R[i-1]=e;
        CurrentSize++;
    }
    void Print()
    {
        for(int i=0;i<CurrentSize;i++)
        {
            cout<<R[i]<<" ";
        }
        cout<<endl;
    }
    void InsertionSort();//直接插入排序
    void BinaryInsertSort();//折半插入排序
    void ShellSort();//希尔排序
    void BubbleSort();//冒泡排序
    void QuickSort();//快速排序
    int Partition(int low,int high);//快速排序
    void QSort(int low,int high);

};
void RecordList::InsertionSort()
{
    int i,j;Element temp;
    for(i=1;i<CurrentSize;i++)
    {
        temp=R[i];//将带排序数据存储于临时变量
        //寻找合适的插入的下标j
        for(j=i-1;j>=0;j--)
        {
            if(R[j]>temp) R[j+1]=R[j];
            else //找到了一个合适的下标
                break;
        }
        //j==-1 R[0]=temp或j之后的位置
        R[j+1]=temp;//temp回填
    }
}
void RecordList::BinaryInsertSort()
{
     int i,j;Element temp;
     int left,right,middle;
     for(i=1;i<CurrentSize;i++)
     {
         temp=R[i];//将带排序数据存储于临时变量
         //寻找合适的插入的下标j
         left=0,right=i-1;
         while(left<=right)
         {
             middle=(left+right)/2;
             if(temp<R[middle]) right=middle-1;
             else left=middle+1;
         }
         for(j=i-1;j>=left;j--)
             R[j+1]=R[j];
         //回填
         R[left]=temp;
     }
}
/*希尔排序
先讲整个待排序记录 分割 成为 若干个 子序列,
保证子序列在原始数组中不相邻 且间距gap相等
分别对每个子序列 进行直接插入排序;
然后减少记录间的间距,直到最后间距减小为1,
待整个序列中的记录 “基本有序”时,
再对全体记录进行一次直接插入排序

*/
void RecordList::ShellSort()
{
    int gap=CurrentSize,i,j;Element temp;
    do
    {
        gap/=3;
        for(i=gap;i<CurrentSize;i++)
        {
            temp=R[i];
            j=i;//j每趟  子序列的直接插入排序的比较的子下标
            while(j>=gap&&temp<R[j-gap])
            {
                R[j]=R[j-gap];j=j-gap;
            }
            R[j]=temp;
        }
    }while(gap>=1);
}
/*
从数组末端R[n-1]开始,不断比较相邻元素,
若逆序则交换,第一趟冒泡可使最小元素浮到R[0]
继续第二轮冒泡,从R[1]-R[n-1]从确定最小元素
*/
//
void RecordList::BubbleSort()
{
    int pass=1;//做冒泡的次数
    int NoSwap=0;//是否交换过:初始值有交换过
    while(pass<CurrentSize&&NoSwap==0)//最多CurrentSize-1
    {
        NoSwap=1;//每趟冒泡做之前均认为下面的两两元素都无需交换
        //每趟的冒泡
        for(int j=CurrentSize-1;j>=pass;j--)
        {
            if(R[j]<R[j-1])
            {Swap(R[j],R[j-1]);NoSwap=0;}
        }
        pass++;
    }
}
//基准值  枢轴值
//较基准值较大记录  从前面移动到后面
//较基准值较小记录  从后面移动到前面

void RecordList::QuickSort()
{
    QSort(0,CurrentSize-1);
}
void RecordList::QSort(int low,int high)
{
    if(low<high){
        int pivotpos=Partition(low,high);
    QSort(low,pivotpos-1);
    QSort(pivotpos+1,high);
    }
}
int RecordList::Partition(int low,int high)
{
    //用子表第一个元素作枢轴记录
    Element pivot=R[low];
    while(low<high)
    {
        //high从后往前扫描,直到R[high]<pivot
        //(在后面的区域找到了一个比pivot更小的数)
            while(low<high&&R[high]>=pivot)high--;
            //将R[high]移动到R[low]的位置
            R[low]=R[high];
            //low从前往后扫描,直到R[low]>pivot
            while(low<high&&R[low]<=pivot) low++;
            //将R[low]移动到R[high]的位置
                R[high]=R[low];
    }
    R[low]=pivot;
    return low;//low所在的位置
}
void main()
{
    int data[20]={26,88,41,35,62,16,51,38,26};
    RecordList list(20);
    for(int i=1;i<=9;i++)
        list.Insert(data[i-1],i);
    list.Print();
    list.QuickSort();
    list.Print();
    //list.BinaryInsertSort();
    //list.Print();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 排序(上):为什么插入排序比冒泡排序更受欢迎? 排序对于任何一个程序员来说,可能都不会陌生。你学的第一个算法,可能...
    GhostintheCode阅读 3,356评论 4 27
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,428评论 1 4
  • 本文首发于我的个人博客:尾尾部落 排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法...
    繁著阅读 4,572评论 3 119
  • 一. 写在前面 要学习算法,“排序”是一个回避不了的重要话题,在分析完并查集算法和常用数据结构之后,今天我们终于可...
    Leesper阅读 2,531评论 0 40
  • 隆冬微暖锁玉尘,浓霾深深重千斤。 翘盼鸾鸟吼春雷,烟雨蒙蒙涤孤魂 企盼一场雨,那怕是伤心雨。 注:玉尘指雪 ...
    木易书阅读 271评论 2 4