插入排序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); }