插入排序(C++实现)
前一节写了冒泡排序算法,这节来说下插入排序算法。
插入排序算法的时间复杂度和冒泡排序一样,都是O(n^2)。
插入排序算法的思想是:将整个数组a分为有序和无序的两个部分。前者在左边,后者在右边。开始有序的部分只有a[0] , 其余都属于无序的部分。每次取出无序部分的第一个(最左边)元素,把它加入有序部分。假设插入合适的位置p,则原p位置及其后面的有序部分元素都向右移动一个位置,有序的部分即增加了一个元素。一直做下去,直到无序的部分没有元素。
具体代码实现如下:
#include <iostream>
using namespace std;
//插入排序:升序
template<class T>
void insert_sort(T arr[], int len)
{
for (int i = 1; i < len; i++) // 乱序区
{
T temp = arr[i]; //临时变量,保存每轮待插入到有序区的元素
int j = i - 1; //每轮有序区的最后元素的位置,也是有序区最大的元素位置
while (j >= 0 && arr[j] >= temp) //遍历有序区没有越界,且有序区元素大于待插入元素
{
arr[j + 1] = arr[j]; //将有序区该位置的元素往后移一位
j--; // 待遍历的位置往前移动一位,以便下次比较
}
arr[j + 1] = temp; //遍历到最后,或者遍历到有序区某位置元素比待插入元素小时,将待插入元素插入到该位置
}
}
template<class T>
void printArr(T arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << ",";
}
cout << endl;
}
int main()
{
//测试 int 型数组
int arr[] = { 10,8,4,2,7,6,3,1,9,5 };
int len = sizeof(arr) / sizeof(int);
//排序
insert_sort(arr, len);
//输出排序后的数组元素
printArr(arr, len);
//测试字符串数组
char arr2[] = "gdfeabdc";
len = strlen(arr2); //求字符串长度
//排序
insert_sort(arr2, len);
//输出排序后的数组元素
printArr(arr2, len);
system("pause");
return 0;
}