c++监视哨插入排序
时间: 2023-12-07 18:39:04 浏览: 40
以下是C++实现监视哨插入排序的代码和解释:
```c++
void insert_sort(int arr[], int length) {
int i, j;
for (i = 2; i <= length; i++) {
arr[0] = arr[i]; // 将待插入元素存放到监视哨中
for (j = i - 1; arr[j] > arr[0]; j--) {
arr[j + 1] = arr[j]; // 将大于待插入元素的全部向后移一个
}
arr[j + 1] = arr[0]; // 插入待插入元素
}
}
```
这里的监视哨是指在数组的第一个位置上设置一个哨兵元素,用于简化插入排序的实现。在插入排序中,我们需要将待插入元素插入到已排序的序列中,而为了找到插入位置,我们需要不断地将已排序的元素向后移动,直到找到合适的位置。这个过程比较繁琐,而且需要不断地比较和移动元素,效率比较低。如果我们在数组的第一个位置上设置一个哨兵元素,那么我们就可以省去一些比较和移动的操作,从而提高排序的效率。
相关问题
c++的直接插入排序
直接插入排序是一种简单的排序算法,其基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。以下是C++实现直接插入排序的代码:
```c++
void DirectInsertSort(int arr[], int len) {
int i, j;
for (i = 1; i < len; i++) {
j = i - 1;
int temp = arr[i];
while (j >= 0 && temp < arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
}
```
使用c++做出折半插入排序
以下是使用C++实现折半插入排序的代码和解释:
```cpp
void binaryInsertSort(int arr[], int len) {
int front, end, temp;
for (int i = 1; i < len; i++) {
temp = arr[i];
front = 0;
end = i - 1;
while (front <= end) {
int mid;
mid = (front + end) / 2;
if (temp < arr[mid]) {
end = mid - 1;
} else {
front = mid + 1;
}
}
for (int z = i; z > front; z--) {
arr[z] = arr[z - 1];
}
arr[front] = temp;
}
}
```
折半插入排序是一种插入排序的变种,它通过二分查找的方式来减少比较的次数。具体实现过程如下:
1. 从第二个元素开始,将当前元素存储在一个临时变量temp中。
2. 用二分查找的方式在前面已经排好序的子数组中找到temp应该插入的位置,即找到第一个比temp大的元素的位置。
3. 将从i-1到front的元素都向后移动一位,空出front的位置。
4. 将temp插入到front的位置。