插入排序1 (直接插入)

//#include <stdio.h>             // c 库
#include <stdlib.h>                //maclloc 库
#include <iostream>                // c++ 库
#include <time.h>

// 有本句 ,下面cout 前面可以没有  std::
using namespace std;
typedef int   Elem;
#define MAXSIZE 10


typedef struct {
    Elem data[MAXSIZE + 1];
    int len;
} SqQueue;

void InitSq(SqQueue& T) {
    //随机生成数组
    srand((unsigned)time(NULL));
    for (int i = MAXSIZE; i > 0; i--)
        T.data[i] = rand() % 30;
}

void TravSq(SqQueue T) {
    for (int i = 1; i <= MAXSIZE; i++)
        cout  << T.data[i] << " ";
    cout << "\n--------- \n";
}

//插入排序(直接查找插入)
//外层循环指针i从2到 数组[最大],对每个元素进行排序
//内层循环指针j 从i-1 至 1,当前如果比待排序的元素大就后移
//使用哨兵,将待排元素存入数组[0],防止j 越界
void InseSort(SqQueue& T) {
    int i, j;
    for (i = 2; i <= MAXSIZE; i++)
    {
        if (T.data[i] < T.data[i - 1]) { //如果待排元素小于前驱则需排序
            T.data[0] = T.data[i];       //复制哨兵
            for (j = i - 1; T.data[j] > T.data[0]; j--) {
                T.data[j + 1] = T.data[j]; //后移
            }

            T.data[j + 1] = T.data[0];  //插入元素
        }
    }
}

//插入排序(二分查找插入)
//首先查找位置,然后从后向前移动数据,然后插入
//二分时,mid 若大于待排元素,说明在前面low区域,移动high指针,反之亦然
//二分查找完成low==high+1 ,插入位置为low的位置
void InseBI(SqQueue& T) {
    for (int i = 2; i <= MAXSIZE; i++)
    {
        int x = T.data[i];
        int low = 1, high = i - 1, mid;
        while (low <= high)
        {
            mid = (low + high) / 2;
            if (T.data[mid] > x)
                high = mid - 1;
            else low = mid + 1;
        }

        for (int j = i - 1; j >= high; --j)
            T.data[j + 1] = T.data[j];
        T.data[low] = x;
        // cout << " low  " << low << " high   " << high << " \n";
    }
}

void main() {

    SqQueue T;
    InitSq(T);
    TravSq(T);

    //InseSort(T);
    InseBI(T);

    TravSq(T);

}

 

posted @ 2021-09-13 22:45  abel2020  阅读(39)  评论(0编辑  收藏  举报