打算好好复习一下几种排序算法,今天看了一下插入排序,包括:
1. 直接插入排序(其中又包括先查找后移位 和 边查找边移位)
直接插入排序的运行时间和待排序的原始排列顺序十分相关。
2. 折半插入排序(二分插入排序)
3. 希尔排序(缩小增量排序)
代码如下:
#include <iostream>
#include <vector>
using namespace std;
void swap(int &number1, int &number2)
{
int temp = number1;
number1 = number2;
number2 = temp;
}
//start和end是要输出的开始和结束下标
void printArray(int array[], int start, int end)
{
cout<<"numbers: ";
for(int i=start; i<=end; i++)
cout<<array[i]<<"\t";
cout<<endl;
}
//直接插入排序
void insertSort(int numbers[], int length)
{
if(numbers == NULL || length <= 0) return;
int base;//保存每次查找过程中的待插入数字
for(int outLoop=1; outLoop<length; ++outLoop)
{
base = numbers[outLoop];
//下面过程是核心代码,边查找位置边交换
for(int innerLoop=outLoop-1; innerLoop>=0; --innerLoop)
{
if (numbers[innerLoop] <= base) break;
else swap(numbers[innerLoop], numbers[innerLoop+1]);
// printArray(numbers, 0, 6);
}
}
}
//折半查找插入排序
void inserSortHalf(int numbers[], int length)
{
if(numbers == NULL || length <= 0) return;
int base;//保存每次查找过程中的待插入数字
for(int outLoop=1; outLoop<length; ++outLoop)
{
base = numbers[outLoop];
//下面过程是核心代码,每次折半查找,即二分查找
int left = 0;
int right = outLoop-1;
int middle;
while(left<=right) //循环结束时可以找到当前待插入数字 应该插入的位置
{
middle = (left+right)/2;
if(base < numbers[middle]) right = middle-1;
else left = middle+1;
}
for(int i=outLoop-1; i>=left; --i) //将待插入位置右面的数字向右移动一位
numbers[i+1] = numbers[i];
numbers[left] = base;
}
}
//希尔排序(缩小增量排序)
void shellSort(int numbers[], int length)
{
int gap = length;//初始增量
int base;
int ipre;
do
{
gap = (gap/3)+1;//更新gap
for(int i = 0+gap; i<length; i++)
{
if(numbers[i-gap] > numbers[i])
{
base = numbers[i];
ipre = i-gap;
do
{
numbers[ipre+gap] = numbers[ipre];
ipre -= gap;
}while(ipre>=0 && base<numbers[ipre]);
numbers[ipre+gap] = base;
}
}
}while(gap>1);
}
int main()
{
int numbers[] = {4, 3, 7, 2, 5, 6, 1};
printArray(numbers, 0, 5);
shellSort(numbers, 7);
cout<<"after shellSort: "<<endl;
printArray(numbers, 0, 5);
system("pause");
return 0;
}