代码:
/插入排序和希尔排序测试/
void printArray14(int arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void insertSort(int arr[], int start, int end)
{
// 无序插入有序队列,先把第一个元素看成有序队列,从把它后面的无序队列元素依次插入
int j;
for (int i = 1; i <= end; i++)
{ // 数组的下标从0开始,从下标1开始往前插
if (arr[i] < arr[i - 1])
{
int temp = arr[i]; // temp保存要插入的数据
for (j = i - 1; j >= 0 && arr[j] > temp; j--)
{ // arr[j]是前面的有序队列的下标,有序队列从右向左依次同temp比较
arr[j + 1] = arr[j]; // 如果arr[j]比temp大,往后移动,
}
arr[j + 1] = temp; // 如果arr[j]小于等于temp,把temp放在arr[j+1]这个位置
}
}
}
void shellSort(int arr[], int start, int end)
{
int increasement = (end + 1) / 3 + 1;
int i, j, k;
do
{
increasement = increasement / 3 + 1; // 确定分组
for (i = 0; i < increasement; i++)
{ // 分别处理每个分组
for (j = i + increasement; j <= end; j += increasement)// arr[j]是第一无序数据
{
if (arr[j - increasement] > arr[j]) // arr[j]同该组前面最后一个有序数据比较,如果小于才开始进行往前插入操作
{
int temp = arr[j];
for (k = j - increasement; k >= 0 && arr[k] > temp; k -= increasement)// arr[k]是前面的有序数据,如果大于temp,把arr[k]往后移动
{
arr[k + increasement] = arr[k];
}
arr[k + increasement] = temp; // 如果arr[k]小于等于temp,把temp放到arr[k+increasement]
}
}
}
} while (increasement > 1);//增量逐渐减少,也就是分组逐渐减少,最后进行一次全排序
}
void test14()
{
cout << “--------test 插入排序--------” << endl;
int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
printArray(arr, sizeof(arr) / sizeof(int));
insertSort(arr, 0, sizeof(arr) / sizeof(int) - 1); // 注意数组下标是从0开始的
printArray(arr, sizeof(arr) / sizeof(int));
cout << "--------test 希尔排序--------" << endl;
int arr02[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
printArray(arr02, sizeof(arr02) / sizeof(int));
shellSort(arr02, 0, sizeof(arr02) / sizeof(int) - 1);
printArray(arr02, sizeof(arr02) / sizeof(int));
}
extern “C” void app_main(void)
{
test14();
}