数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序
一、排序概念
将一组杂乱无章的数据按一定规律顺次排列起来。
将无序序列排成一个有序序列(由小到大或由大到小)的运算。
二、排序方法分类
1、按数据存储介质
| 名称 | 描述 |
| 内部排序 | 数据量不大、数据在内存,无需内外交换存交换存储。 |
| 外部排序 | 数据量较大、数据在外存(文件排序)外部排序时,要将数据分批调入内存来排序,中间结果还是要及时放入外存,显然外部排序要复杂得多。 |
2、按比较器个数
| 名称 | 描述 |
| 串行排序 | 单处理机。(同一时刻比较一对元素) |
| 并行排序 | 多处理机。(同一时刻比较多对元素) |
3、按主要操作
| 名称 | 描述 |
| 比较排序 | 用比较的方法(插入排序、交换排序、选择排序、归并排序) |
| 基数排序 | 不比较元素的大小,仅仅根据元素本身的取值确定其有序位置。 |
4、按辅助空间
| 名称 | 描述 |
| 原地排序 | 辅助空间用量为O(1)的排序方法。(所占的辅助存储空间与参加排序的数据量大小无关) |
| 非原地排序 | 辅助空间用量超过O(1)的排序方法。 |
5、按稳定性
| 名称 | 描述 |
| 稳定排序 | 能够使任何数值相等的元素,排序以后相对次序不变。 |
| 非稳定排序 | 不是稳定排序的方法。 |
6、按自然性
| 名称 | 描述 |
| 自然排序 | 输入数据越有序,排序的速度越快的排序方法。 |
| 非自然排序 | 不是自然排序的方法。 |
三、排序稳定性的意义
排序的稳定性只对结构类型数据排序有意义。
例如说我们只对分数进行排序,相同分数排序后是否更换位置,对于结果是没有影响的。然而我们对于数学分数、语文分数和人名进行综合排序,虽然数学分数相同的两个同学,但语文成绩不同,名次先后也会有某种变化。
排序方法是否稳定,并不能衡量一个排序算法的优劣。
四、插入排序基本思想
每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。
即便插入边排序,保证子序列中随时都是排好序的。
五、直接插入排序(哨兵)
1、算法思路

Data : [ 0 ,1 ,2 ,8 ,5 ,4 ,6 ,3 ]
升序为例,1,2,8是排好序的,发现5比8小,将5放到哨兵位,8往后移动一位,哨兵再和2比,比2大,退出此次循环,原有8的位置换成哨兵5。
Data : [ 5 ,1 ,2 ,5 ,8 ,4 ,6 ,3 ]
现在移动到下一位4,1,2,5,8是排好序的,发现4比8小,将4放到哨兵位,8往后移动一位,哨兵4再和5比发现小,5往后移动一位,哨兵再和2比,比2大,退出此次循环,原有5的位置换成哨兵4。
Data : [ 4 ,1 ,2 ,4 ,5 ,8 ,6 ,3 ]
现在移动到下一位6,1,2,4,5,8是排好序的,发现6比8小,将6放到哨兵位,8往后移动一位,哨兵再和5比,比5大,退出此次循环,原有8的位置换成哨兵6。
Data : [ 6 ,1 ,2 ,4 ,5 ,6 ,8 ,3 ]
现在移动到下一位6,1,2,4,5,6,8是排好序的,发现3比8小,将3放到哨兵位,且比4,5,6,8都小,4,5,6,8往后挪动一位,比2大,退出此次循环,原有4的位置换成哨兵3。
Data : [ 3 ,1 ,2 ,3 ,4 ,5 ,6 ,8 ]
2、源码
(1)DirectInsertSortSentrySqQueue
Status DirectInsertSortSentrySqQueue(SqQueue* Queue)
{JudgeAllNullPointer(Queue);if (Queue->Flag != INT_TYPE_FLAG){return FailFlag;}int* Array = (int*)(Queue->Data);QueueLenType i;QueueLenType j;for (i = 2; i < Queue->SqQueueLen; i++){if (Array[i] < Array[i - 1])//升序或降序{Array[0] = Array[i];for (j = i - 1; Array[0] < Array[j]; j--){Array[j + 1] = Array[j];//移动元素}Array[j + 1] = Array[0];//插入到元素的后一位。PrintfSqQueue(Queue);}}LogFormat(Debug,"Direct Insert Sort Sentry SqQueue OK.\n");return SuccessFlag;
}
3、Linux环境编译测试
[gbase@czg2 Sort]$ make
gcc -Wall -Wextra -O3 InsertSort.c main.c -o TestSort -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/Log/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/HashTable/include/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqQueue/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqStack/ -L /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Make/Libs/ -lPublicFunction -lLog -lSqQueue[gbase@czg2 Sort]$ time ./TestSort
2023-8-29--[ Debug ]--Init SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 0 ,1 ,2 ,8 ,5 ,4 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 5 ,1 ,2 ,5 ,8 ,4 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 4 ,1 ,2 ,4 ,5 ,8 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 6 ,1 ,2 ,4 ,5 ,6 ,8 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,3 ,4 ,5 ,6 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Direct Insert Sort Sentry SqQueue OK.
2023-8-29--[ Info ]--Sort Function Elapsed Time : 0 s
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,3 ,4 ,5 ,6 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Destroy SqQueue OKreal 0m0.002s
user 0m0.001s
sys 0m0.001s
六、二分插入排序(哨兵)
1、算法思路

升序为例,1,2,8为有序序列,5小于8,5放到哨兵位, 开始进行二分查找,以Low <= High为进行条件。
2023-8-29--[ Debug ]--Low : 1, High : 3, Mid : 2.
Mid:2对应2,2小于5,Low = Mid + 1 = 3,Low <= High,继续循环。
2023-8-29--[ Debug ]--Low : 3, High : 3, Mid : 3.
Mid:3对应8,5小于8,High = Mid - 1 = 2,不满足Low <= High,退出循环。
将8往后挪动一位。哨兵填写到原有8的位置,变化如下:
Data : [ 5 ,1 ,2 ,5 ,8 ,4 ,6 ,3 ]
1,2,5,8为有序序列,4小于8,4放到哨兵位, 开始进行二分查找,以Low <= High为进行条件。
2023-8-29--[ Debug ]--Low : 1, High : 4, Mid : 2.
Mid:2对应2,2小于4,Low = Mid + 1 = 3,Low <= High,继续循环。
2023-8-29--[ Debug ]--Low : 3, High : 4, Mid : 3.
Mid:3对应5,4小于5,High = Mid - 1 = 2,不满足Low <= High,退出循环。
将5,8往后挪动一位。哨兵填写到原有5的位置,变化如下:
Data : [ 4 ,1 ,2 ,4 ,5 ,8 ,6 ,3 ]
1,2,4,5,8为有序序列,6小于8,6放到哨兵位, 开始进行二分查找,以Low <= High为进行条件。
2023-8-29--[ Debug ]--Low : 1, High : 5, Mid : 3.
Mid:3对应4,4小于6,Low = Mid + 1 = 4,Low <= High,继续循环。
2023-8-29--[ Debug ]--Low : 4, High : 5, Mid : 4.
Mid:4对应5,5小于6,Low = Mid + 1 = 5,Low <= High,继续循环。
2023-8-29--[ Debug ]--Low : 5, High : 5, Mid : 5.
Mid:5对应5,6小于8,High = Mid - 1 = 4,不满足Low <= High,退出循环。
将8往后挪动一位。哨兵填写到原有8的位置,变化如下:
Data : [ 6 ,1 ,2 ,4 ,5 ,6 ,8 ,3 ]
1,2,4,5,6,8为有序序列,3小于8,3放到哨兵位, 开始进行二分查找,以Low <= High为进行条件。
2023-8-29--[ Debug ]--Low : 1, High : 6, Mid : 3.
Mid:3对应4,3小于4,High = Mid - 1 = 2,Low <= High,继续循环。
2023-8-29--[ Debug ]--Low : 1, High : 2, Mid : 1.
Mid:1对应1,1小于3,Low = Mid + 1 = 2,Low <= High,继续循环。
2023-8-29--[ Debug ]--Low : 2, High : 2, Mid : 2.
Mid:2对应2,2小于3,Low = Mid + 1 = 3,不满足Low <= High,退出循环。
将4,5,6,8往后挪动一位。哨兵填写到原有4的位置,变化如下:
Data : [ 3 ,1 ,2 ,3 ,4 ,5 ,6 ,8 ]
2、源码
(1)BinaryInsertSortSentrySqQueue
Status BinaryInsertSortSentrySqQueue(SqQueue* Queue)
{JudgeAllNullPointer(Queue);if (Queue->Flag != INT_TYPE_FLAG){return FailFlag;}int* Array = (int*)(Queue->Data);QueueLenType i;QueueLenType j;QueueLenType Mid;QueueLenType High;QueueLenType Low;for (i = 2; i < Queue->SqQueueLen; i++){if (Array[i - 1] < Array[i])//如果已经是有序的就不用进行二分查找{continue;}Array[0] = Array[i];//存放哨兵Low = 1;High = i - 1;while (Low <= High)//折半查找{Mid = (Low + High) / 2;LogFormat(Debug,"Low : %lld, High : %lld, Mid : %lld.\n",Low,High,Mid);if (Array[0] < Array[Mid]){High = Mid - 1;}else{Low = Mid + 1;}}for (j = i - 1; j >= High + 1; j--)//为什么High + 1,下次看见需推导几次,方便加深记忆。{Array[j + 1] = Array[j];//移动元素PrintfSqQueue(Queue,Debug);}Array[High + 1] = Array[0];//插入元素}LogFormat(Debug,"Binary Insert Sort Sentry SqQueue OK.\n");return SuccessFlag;
}
3、Linux环境编译测试
[gbase@czg2 Sort]$ time ./TestSort
2023-8-29--[ Debug ]--Init SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 0 ,1 ,2 ,8 ,5 ,4 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Low : 1, High : 3, Mid : 2.
2023-8-29--[ Debug ]--Low : 3, High : 3, Mid : 3.
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 5 ,1 ,2 ,8 ,8 ,4 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Low : 1, High : 4, Mid : 2.
2023-8-29--[ Debug ]--Low : 3, High : 4, Mid : 3.
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 4 ,1 ,2 ,5 ,8 ,8 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 4 ,1 ,2 ,5 ,5 ,8 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Low : 1, High : 5, Mid : 3.
2023-8-29--[ Debug ]--Low : 4, High : 5, Mid : 4.
2023-8-29--[ Debug ]--Low : 5, High : 5, Mid : 5.
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 6 ,1 ,2 ,4 ,5 ,8 ,8 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Low : 1, High : 6, Mid : 3.
2023-8-29--[ Debug ]--Low : 1, High : 2, Mid : 1.
2023-8-29--[ Debug ]--Low : 2, High : 2, Mid : 2.
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,4 ,5 ,6 ,8 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,4 ,5 ,6 ,6 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,4 ,5 ,5 ,6 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,4 ,4 ,5 ,6 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Binary Insert Sort Sentry SqQueue OK.
2023-8-29--[ Info ]--Sort Function Elapsed Time : 0 s
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,3 ,4 ,5 ,6 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Destroy SqQueue OKreal 0m0.003s
user 0m0.001s
sys 0m0.002s
七、希尔排序(哨兵)
1、基本思想
先将整个待排记录序列分割成若干个子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
2、特点
(1)一次移动,移动位置较大,跳跃式地接近排序后的最终位置。
(2)最后一次只需要少量移动。
(3)增量序列必须是递减的,最后一个必须是1。
(4)增量序列应该是互质的。
3、算法效率与增量序列
(1)Hibbard
Dk = 2^k - 1 (相邻元素互质)
| 猜想情况 | 算法时间复杂度 |
| 最坏 | O(n^(2 / 3)) |
| 平均 | O(n^(5 / 4)) |
(3)Sedgewick
Dk = 9 * 4^i - 9 * 2^i + 1 或者 4^i - 3 * 2^i + 1
| 猜想情况 | 算法时间复杂度 |
| 最坏 | O(n^(4 / 3)) |
| 平均 | O(n^(7 / 6)) |
4、算法思路

这个算法涉及步长,因为插入排序算法,需要两个大步,一个是查找插入位置,二是移动元素。希尔排序在直接插入排序的基础上优化第二大步移动元素,不像之前是一步步移动,而是几步、几十步、几百步的移动。
假设步长分别为3和1,实际算法中肯定不是这么设置的步长,只是举例,方便之后举一反三。

比较1和5,发现1小于5,不需要进行排序,1号位的1前推3格超过1号位,不需要回推,前进一格。

比较2和4,发现2小于4,不需要进行排序,2号位的2前推3格超过1号位,不需要回推,前进一格。

比较8和6,发现8大于6,进行排序,6放到哨兵位,将8挪动到6的位置,再将哨兵的6放到原来8的位置,3号位的6前推3格超过1号位,不需要回推,前进一格。
继续往后移动, 比较5和3,发现5大于3,进行排序。
3放到哨兵位,将5挪动到3的位置,再将哨兵的3放到原来5的位置。
4号位的3比1号位的1大,不需要回推,3的步长排序结束了,现在开始步长为1的排序。

比较1和2,发现1小于2,不需要进行排序,1号位的1前推1格超过1号位,不需要回推,前进一格。

比较2和6,发现2小于6,不需要进行排序, 2号位的2比1号位的1大,不需要回推,往后挪动一位。

比较6和3,发现6大于3,进行排序,3放到哨兵位,将6挪动到3的位置,再将哨兵的3放到原来6的位置。

3号位的3比2号位的2大,不需要回推,往后挪动一位。

比较6和4,发现6大于4,进行排序,4放到哨兵位,将6挪动到4的位置,再将哨兵的4放到原来6的位置,4号位的4比3号位的3大,不需要回推,往后挪动一位。

比较6和8,发现6小于8,不需要进行排序,往后挪动一位。

比较8和5,发现8大于5,进行排序,5放到哨兵位,将8挪动到5的位置,再将哨兵的5放到原来8的位置。

6号位的5比5号位的6小,需要回推。

5放到哨兵位,将6挪动到5的位置,再将哨兵的5放到原来6的位置。

5号位的5比4号位的4大,不需要回推,结束排序。
5、源码
(1)ShellSortSentrySqQueue
Status ShellSortSentrySqQueue(SqQueue* SortQueue)
{JudgeAllNullPointer(SortQueue);if (SortQueue->Flag != INT_TYPE_FLAG){return FailFlag;}SqQueue* InremrntSeqQueue = NULL;StepLenType StepLen = 0;QueueLenType i = 0;QueueLenType j = 0;QueueLenType x = 0;int* Array = SortQueue->Data;InitSqQueue(&InremrntSeqQueue, INCREMENT_SEQ_MAX_LEN, INT_TYPE_FLAG);//INCREMENT_SEQ_MAX_LEN队列长度需要待商量,这边我先给了一个大致初值。CreateShellSortInremrntSeq(InremrntSeqQueue, SortQueue);for (i = GetSqQueueLen(InremrntSeqQueue) - 1; i >= 0 ; i--){ReadSqQueue(InremrntSeqQueue,i,&StepLen);//从增量序列中读出步长。for (j = StepLen + 1; j < GetSqQueueLen(SortQueue); j++){if (Array[j] < Array[j - StepLen])//当前值比减步长后的值小,说明需要交换位置。{Array[0] = Array[j];//将比较小的值,放入哨兵位。for ( x = j - StepLen; x > 0 && (Array[0] < Array[x]); x = x - StepLen)//j为最大限制,按照步长向左推进。{Array[x + StepLen] = Array[x];}Array[x + StepLen] = Array[0];PrintfSqQueue(SortQueue,Debug);}}}DestroySqQueue(&InremrntSeqQueue);LogFormat(Debug,"Shell Sort Sentry SqQueue OK.\n");return SuccessFlag;
}
(2)MyIntSquare
int MyIntSquare(int Base, int Index)
{int i;int Res = 1;for ( i = 0; i < Index; i++){Res *= Base;}return Res;
}
返回Base的Index次方。
(3)CreateShellSortInremrntSeq
//希尔排序增量序列的最大值为排序队列长度的二分一。(小于)
Status CreateShellSortInremrntSeq(SqQueue* InremrntSeqQueue, SqQueue* SortQueue)
{JudgeAllNullPointer(InremrntSeqQueue);JudgeAllNullPointer(SortQueue);StepLenType i = 0;StepLenType Val = 0;StepLenType Tmp = GetSqQueueLen(SortQueue) / INCREMENT_SEQ_SPLIT_VAL;while (1){Val = 9 * (MyIntSquare(4,i) - MyIntSquare(2,i)) + 1;if (Val > Tmp){break;}EnterSqQueue(InremrntSeqQueue,&Val);i++;}PrintfSqQueue(InremrntSeqQueue,Debug);LogFormat(Debug,"Create Shell Sort Inremrnt Sequence OK.\n");return SuccessFlag;
}
创建希尔排序使用的增量序列,增量序列的算法用的是Sedgewick。
6、Linux环境编译测试
[gbase@czg2 Sort]$ time ./TestSort
2023-8-29--[ Debug ]--Init SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 0 ,1 ,2 ,8 ,5 ,4 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Init SqQueue OK
2023-8-29--[ Debug ]--Enter SqQueue OK
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 1 ]
FrontIndex : 0
RearIndex : 1
SqQueueLen : 1
SqQueueMaxLen : 20
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Create Shell Sort Inremrnt Sequence OK.
2023-8-29--[ Debug ]--Read SqQueue OK
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 5 ,1 ,2 ,5 ,8 ,4 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 4 ,1 ,2 ,4 ,5 ,8 ,6 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 6 ,1 ,2 ,4 ,5 ,6 ,8 ,3 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,3 ,4 ,5 ,6 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Destroy SqQueue OK
2023-8-29--[ Debug ]--Shell Sort Sentry SqQueue OK.
2023-8-29--[ Info ]--Sort Function Elapsed Time : 0 s
2023-8-29--[ Debug ]--SqQueue Data :
Data : [ 3 ,1 ,2 ,3 ,4 ,5 ,6 ,8 ]
FrontIndex : 0
RearIndex : 0
SqQueueLen : 8
SqQueueMaxLen : 8
Flag : INT_TYPE_FLAG
2023-8-29--[ Debug ]--Destroy SqQueue OKreal 0m0.002s
user 0m0.000s
sys 0m0.002s
相关文章:
数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序
一、排序概念 将一组杂乱无章的数据按一定规律顺次排列起来。 将无序序列排成一个有序序列(由小到大或由大到小)的运算。 二、排序方法分类 1、按数据存储介质 名称描述内部排序数据量不大、数据在内存,无需内外交换存交换存储。外部排序…...
Qt+C++桌面计算器源码
程序示例精选 QtC桌面计算器源码 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<QtC桌面计算器源码>>编写代码,代码整洁,规则,易读。 学习与…...
kubesphere安装Maven+JDK17 流水线打包
kubesphere 3.4.0版本,默认支持的jav版本是8和11,不支持17 。需要我们自己定义JenKins Agent 。方法如下: 一、构建镜像 1、我们需要从Jenkins Agent的github仓库拉取master最新源码,最新源码里已经支持jdk17了。 git clone ht…...
百度搜索清理大量低质量网站
我是卢松松,点点上面的头像,欢迎关注我哦! 据部分站长爆料:百度大规模删低质量网站的百度资源站长平台权限,很多网站都被删除了百度站长资源平台后台权限,以前在百度后台添加的网站大量被删除!…...
WPF数据模板
样式提供了基本的格式化能力,但它们不能消除到目前为止看到的列表的最重要的局限性:不管如何修改ListBoxItem,它都只是ListBoxItem,而不是功能更强大的元素组合。并且因为每个ListBoxItem只支持单个绑定字段,所以不可能…...
浙江绿农环境:将废弃矿山变耕地,为生态文明贡献力量
近年来,随着可持续发展理念在中国乃至全球的日益普及,浙江绿农生态环境有限公司以其独特的创新和实践,成为了绿色发展的典范,在奋进新时代、建设新天堂的背景下,绿农环境在杭州市固废治理行业迈出坚实的步伐࿰…...
HTML/CSS盒子模型
盒子:页面中的所有的元素(标签),都可以看做一个盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更加方便的进行页面布局 盒子模型的组成: 内容区域(contentÿ…...
《Java面向对象程序设计》学习笔记——CSV文件的读写与处理
笔记汇总:《Java面向对象程序设计》学习笔记 笔记记录的不是非常详实,如果有补充的建议或纠错,请踊跃评论留言!!! 什么是CSV文件 CSV文件的定义 CSV 是英文 comma-separated values 的缩写࿰…...
opencv 案例05-基于二值图像分析(简单缺陷检测)
缺陷检测,分为两个部分,一个部分是提取指定的轮廓,第二个部分通过对比实现划痕检测与缺角检测。本次主要搞定第一部分,学会观察图像与提取图像ROI对象轮廓外接矩形与轮廓。 下面是基于二值图像分析的大致流程 读取图像将图像转换…...
Elasticsearch入门介绍
应用场景 1 它提供了强大的搜索功能,可以实现类似百度、谷歌等搜索。 2 可以搜索日志或者交易数据,用来分析商业趋势、搜集日志、分析系统瓶颈或者运行发展等等 3 可以提供预警功能(持续的查询分析某个数据,如果超过一定的值&a…...
QML Book 学习基础3(动画)
目录 主要动画元素 例子: 非线性动画 分组动画 Qt 动画是一种在 Qt 框架下创建交互式和引人入胜的图形用户界面的方法,我们可以认为是对某个基础元素的多个设置 主要动画元素 PropertyAnimation-属性值变化时的动画 NumberA…...
Lesson4-3:OpenCV图像特征提取与描述---SIFT/SURF算法
学习目标 理解 S I F T / S U R F SIFT/SURF SIFT/SURF算法的原理,能够使用 S I F T / S U R F SIFT/SURF SIFT/SURF进行关键点的检测 SIFT/SURF算法 1.1 SIFT原理 前面两节我们介绍了 H a r r i s Harris Harris和 S h i − T o m a s i Shi-Tomasi Shi−Tomasi…...
语言基础篇9——Python流程控制
流程控制 顺序结构、条件结构、循环结构,顺序结构由自上而下的语句构成,条件结构由if、match-case构成,循环结构由for、while构成。 if语句 flag 1 if flag 1:print("A") elif flag 2:print("B") else:print("…...
MATLAB算法实战应用案例精讲-【概念篇】构建数据指标方法(补充篇)
目录 前言 几个高频面试题目 指标与标签的区别 几个相关概念 数据域 业务过程...
【pyqt5界面化工具开发-12】QtDesigner图形化界面设计
目录 0x00 前言 一、启动程序 二、基础的使用 三、保存布局文件 四、加载UI文件 0x00 前言 关于QtDesigner工具的配置等步骤(网上链接也比较多) 下列链接非本人的(如果使用pip 在命令行安装过pyqt5以及tools,那么就可以跳过…...
CXL.mem S2M Message 释义
🔥点击查看精选 CXL 系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN,…...
设计模式—外观模式(Facade)
目录 一、什么是外观模式? 二、外观模式具有什么优点吗? 三、外观模式具有什么缺点呢? 四、什么时候使用外观模式? 五、代码展示 ①、股民炒股代码 ②、投资基金代码 ③外观模式 思维导图 一、什么是外观模式?…...
Stack Overflow开发者调查发布:AI将如何协助DevOps
Stack Overflow 发布了开创性的2023年度开发人员调查报告 [1]。报告对 90,000 多名开发人员进行了调查,全面展示了当前软件开发人员的体验。接下来,本文将重点介绍几项重要发现,即重要编程语言和工具偏好、人工智能在开发工作流程中的应用以及…...
去掉鼠标系列之二:Sublime Text快捷键使用指南
系列之二,Sublime Text。 Sublime Text 是我们常用的文本工具,常常要沉浸如其中使用,而不希望被鼠标打扰,所以也记录一下。 学会下面这些快捷键,基本上就不需要移动鼠标啦。 1,CtrlK,CtrlV …...
docker-compose安装node-exporter, prometheus, grafana
基础 exporter提供监控数据 prometheus拉取监控数据 grafana可视化监控数据 准备 全部操作在/root/mypromethus中执行 node_exporter docker-compose -f node-exporter.yaml up -d # web访问,查看node_exporter采集到的数据 http://192.168.1.102:9101/metrics…...
5步定制UEFI启动界面:技术爱好者的HackBGRT实战指南
5步定制UEFI启动界面:技术爱好者的HackBGRT实战指南 【免费下载链接】HackBGRT Windows boot logo changer for UEFI systems 项目地址: https://gitcode.com/gh_mirrors/ha/HackBGRT 一、问题发现:启动界面定制的3大痛点 在计算机使用体验中&am…...
小白也能玩转AI绘画:LiuJuan20260223Zimage快速上手指南
小白也能玩转AI绘画:LiuJuan20260223Zimage快速上手指南 你是不是也刷到过那些用AI生成的、细节超棒的人像图片,心里痒痒的,但又觉得那些工具太复杂,光是安装部署就劝退了?别担心,今天要介绍的这个工具&am…...
Uncertainty-Aware Pixel-Level Contrastive Learning for Enhanced Semi-Supervised Medical Image Segmen
1. 医学图像分割的挑战与半监督学习机遇 医学图像分割一直是计算机视觉领域的重要研究方向,它能够帮助医生快速定位病灶区域,提高诊断效率。但在实际应用中,我们常常面临标注数据稀缺的问题——专业医生标注一张CT或MRI图像可能需要数小时&am…...
Pixel Mind Decoder 效果对比视频:同一段文本在不同模型下的情绪解析差异
Pixel Mind Decoder 效果对比视频:同一段文本在不同模型下的情绪解析差异 1. 情绪解析技术的新突破 在自然语言处理领域,情绪识别一直是个充满挑战的任务。传统模型往往只能识别基本的喜怒哀乐,而人类情绪实际上要复杂得多。Pixel Mind Dec…...
ChatGLM-6B角色扮演功能开发:基于Prompt的智能对话系统
ChatGLM-6B角色扮演功能开发:基于Prompt的智能对话系统 1. 引言 想象一下,你正在开发一个智能客服系统,需要让AI能够扮演不同角色的专业人士来回答用户问题。或者你正在创建一个教育应用,希望AI能够化身历史人物、科学导师或文学…...
5个高效能的LabelImg图像标注效率提升实践
5个高效能的LabelImg图像标注效率提升实践 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Studio, the open s…...
不用反向传播也能攻击AI模型?手把手教你用ZOO算法实现黑盒对抗攻击
零阶优化实战:无需反向传播的黑盒对抗攻击指南 当你在网络安全竞赛中遇到一个闭源的图像识别API,或是需要测试自家电商平台商品分类模型的鲁棒性时,传统基于梯度反向传播的白盒攻击方法立刻变得束手无策。这就是ZOO(Zeroth Order …...
Scratch3.0离线编辑器安装指南:一步步教你轻松搞定
1. 为什么你需要Scratch3.0离线编辑器 Scratch作为全球最受欢迎的少儿编程工具,它的在线版本虽然方便,但经常会遇到网络不稳定、加载缓慢的问题。我去年给小学生上课时就遇到过这种情况——全班40个孩子同时登录在线编辑器,结果服务器直接卡死…...
CGAL::Point_set_3 成员函数自查表
参考来源: CGAL 6.1.1 - 3D Point Set: CGAL::Point_set_3< Point, Vector > Class Template Reference 一、基础构造 / 容量 返回值函数名作用小 demoPoint_set_3()构造空点集Point_set ps;size_tnumber_of_points()获取点数auto n ps.number_of_points(…...
RoboMaster装甲板灯条匹配算法实战:从图像预处理到目标框定(附完整C++/OpenCV源码)
1. 项目背景与核心挑战 RoboMaster机甲大师赛中的装甲板识别是自动瞄准系统的关键技术难点。赛场上高速移动的机器人装甲板通常配备LED灯条作为视觉标识,这种设计让计算机视觉算法能够在复杂环境下快速定位目标。但实际开发时会遇到几个头疼的问题:强光干…...
