C++版本直接插入排序

来源:互联网 发布:playmemories mac版 编辑:程序博客网 时间:2024/05/18 22:17

总体思想:将一个元素插入到已经排好序的有序表中,从而得到一个新的记录数增加1的有序表。
技巧是:

默认第一个元素是已经排好序的,后面的元素就是插入他的左边还是右边的问题,默认升序排列,比他小的插到左边,比他大的插到右边(实际上所有元素都在他右边,如果比他大就不交换即可)。


每一次比较都是将第i个元素和第i-1个元素比较,如果发现后面的元素小则表示需要将后面的元素插入到前面的有序表中,才会进行内层循环


内层循环从有序表的最后一个元素开始,往前遍历,直到遇到小于等于哨兵的元素时,停止循环,而之前遍历到的元素都需要进行向后移动,以挪出空位给哨兵(哨兵值就是当前需要插入到新位置的元素的值)。


设置一个哨兵,用来存放需要插入到新位置的元素(就是说这个元素比他前面的元素要小)。


1.外层循环从第二个元素开始(因为默认第一个元素已经排好队了)


2.只有当第i个元素比第i-1个元素小的时候才需要进行内层循环,表示将第i个元素插入到他应该位于的位置,需要在内层循环移动前面有序表里的元素,同时需要用到哨兵缓存当前元素。


3.外层循环遍历到最后一个元素(第n个元素,因有效数据的下标这里从1开始)以后,结束排序。

#include <iostream>using namespace std;#define MAXSIZE 100typedef int Status;#define OK  1#define ERROR 0#define TRUE  1#define FALSE 0template <typename T>class SqList{public:    T r[MAXSIZE+1];    int length;public:    SqList(T * var,int len);    SqList();    void printList();    Status swapElement(int i, int j);    void InsertSort();};template <typename T>SqList<T>::SqList(T * var,int len){    length = len/sizeof(T);    memcpy(&(r[1]), var, len);}template <typename T>SqList<T>::SqList(){    memset(this, 0, sizeof(SqList));}template <typename T>Status SqList<T>::swapElement(int i,int j){    T tmp =this->r[i];    this->r[i] = this->r[j];    this->r[j] = tmp;    return OK;}template <typename T>void SqList<T>::printList(){    for (int i = 1; i <= length; i++)    {        cout << this->r[i] << "\t";    }    cout << endl;}/************************************************************************//* 直接插入排序                                                                     *//************************************************************************/template <typename T>void SqList<T>::InsertSort(){    int i = 0, j = 0;    for (i = 2; i <= length; i++)//外层循环表示从无序表中依次将其元素插入到有序表中                                //默认第一个元素是有序表,所以从第二个元素开始直到第n个元素结束,                                //这些元素都是无序表中的元素,需要依次把它们插入到前面的有序表中                                //一次外层循环表示处理好无序表中的一个元素    {        if (r[i] < r[i - 1])//第i个元素是无序表中的第一个元素                            //第i-1个元素是有序表中的最后一个元素,也是有序表中最大的元素                            //如果无序表中的第一个元素(当前元素)比有序表中的最大元素小                            //表示需要将当前元素往前插,至于插到什么位置,由内层循环决定        {            r[0] = r[i];//利用哨兵将当前元素的值缓存下来            for (j = i - 1; r[j] > r[0]; j--)//内层循环将比当前元素的值(哨兵的值)大的元素后移挪出空位            {                r[j + 1] = r[j];//移动比哨兵大的元素            }            r[j + 1] = r[0];//将哨兵插入空位,该空位以前的元素要么为空要么逗比他小,否则不会结束循环        }    }//遍历到最后一个元素的时候排序完毕}int main(void){    int myList[9] = {90,10,50,80,30,70,40,60,20};    SqList<int> list(myList,sizeof(myList));    cout << "before sort:"<< endl;    list.printList();    list.InsertSort();    cout << "after sort:" << endl;    list.printList();    cout<<"Hello!"<<endl;    system("pause");    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 儿子欠银行的钱怎么办 惹了社会上的混混怎么办 我是五年级惹上混混怎么办 孩子挨欺负家长怎么办幼儿园 孩子被同学欺负不敢上学怎么办 孩子被欺负不敢还手怎么办 2个月的婴儿内热怎么办 孩子把别人打了怎么办 学生在学校被打怎么办 妈和老丈人搞外遇怎么办? 丈人住在双方出资房中怎么办 金木水火土缺水怎么办? 练太极注意不集中怎么办 白色裙子被染色了怎么办 两边的头发向外翘怎么办 感冒的前兆来了怎么办 压腿把筋拉伤了怎么办 压腿压不下去了怎么办 床的气压杆坏了怎么办 床打开压不下去怎么办 裤子大了怎么办小窍门 小孩不准守课堂纪律怎么办 学生在学校体育课受伤怎么办 手指被篮球砸肿了怎么办 眼睛被篮球砸了怎么办 宝宝被篮球砸了怎么办 手被篮球砸肿了怎么办 上体育课时脚不慎扭伤怎么办 孩子受伤没有参加考试怎么办 如果我想离婚对方不愿意怎么办 金龙自切尾怎么办 微信无法正常打开怎么办 大三下体育挂了怎么办 大二体育挂科了怎么办 大四体育老师不给成绩怎么办 大四必修挂科了怎么办 大学挂了20科怎么办 大专重修都没过怎么办 如果孩子一年级就考不及格怎么办 后滚翻做不过去怎么办 练习颠球时脚面总网上翘怎么办