标签:-- 直接 name 元素 过程 using 就是 默认 ace
插入排序是一种简单直观的排序方法,其基本思想在于每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成。插入排序主要有三个算法:直接插入排序、折半插入排序和希尔排序。
直接插入排序的简单思想就是不断地将一个元素插入到一个有序的序列中,使这个序列仍然保持有序。以序列L[1...i-1]和元素L(i)为例,算法步骤如下:
#include <iostream>
using namespace std;
void insertSort(int a[], int n) {
for (int i = 1; i < n; ++i) { // 单个首元素默认有序
int val = a[i]; // 待插入元素
int j;
for (j = i; j > 0 && val < a[j - 1]; --j) // 查找合适位置
a[j] = a[j - 1];
a[j] = val;
}
}
int main() {
const int SIZE = 20;
int a[SIZE] = { 0 };
for (int i = 0; i < SIZE; ++i) {
a[i] = rand() % 100;
cout << a[i] << " ";
}
cout << "\n\n";
insertSort(a, SIZE);
for (auto elem : a)
cout << elem << " ";
return 0;
}
直接插入排序中有两项重要工作,分别是:找出待插入元素应该插入的位置;给待插入元素腾出空间,将该元素放入。折半插入排序则是将查找待插入位置的过程进行优化,使用折半查找法进行查找。
#include <iostream>
using namespace std;
void insertSort(int a[], int n) {
for (int i = 1; i < n; ++i) {
int val = a[i];
int low = 0, high = i - 1, mid;
while (low <= high) { // 折半查找插入元素的位置
mid = (low + high) / 2;
if (a[mid] > val)
high = mid - 1;
else
low = mid + 1;
}
for (int j = i; j > low; --j) // 移动元素
a[j] = a[j - 1];
a[low] = val;
}
}
int main() {
const int SIZE = 10;
int a[SIZE] = { 0 };
for (int i = 0; i < SIZE; ++i) {
a[i] = rand() % 10;
cout << a[i] << " ";
}
cout << "\n\n";
insertSort(a, SIZE);
for (auto elem : a)
cout << elem << " ";
return 0;
}
将待排序序列分割成若干形如L[i, i+d, i+2d, ... i+kd]的“特殊”子序列,分别进行直接插入排序,当整个序列已经呈现“基本有序”时,再对全部序列进行一次直接插入排序。希尔排序的排序过程如下:
#include <iostream>
using namespace std;
void shellSort(int a[], int n) {
for (int d = n / 2; d >= 1; d /= 2) { // 控制步长变化
for (int i = d; i < n; ++i) { // 一个分组内的直接插入排序
int val = a[i];
int j;
for (j = i; j >= d && val < a[j - d]; j -= d)
a[j] = a[j - d];
a[j] = val;
}
}
}
int main() {
const int SIZE = 10;
int a[SIZE] = { 0 };
for (int i = 0; i < SIZE; ++i) {
a[i] = rand() % 10;
cout << a[i] << " ";
}
cout << "\n\n";
shellSort(a, SIZE);
for (auto elem : a)
cout << elem << " ";
return 0;
}
标签:-- 直接 name 元素 过程 using 就是 默认 ace
原文地址:https://www.cnblogs.com/southernEast/p/12713540.html