您的位置:首页 > 其它

排序算法之插入排序

2016-10-29 23:18 211 查看
插入排序算法跟我们平时打扑克一样,将元素插入到已经排序好的数组中。每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。当元素的大部分顺序排好的时候,适合采用插入排序,代码如下:

#include<iostream>
using namespace std;
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
void insertionSort(int arr[], int n)
{
int i, j, k;
for (int  i = 1; i < n; i++)
{
k = arr[i];
j = i - 1;
while (j>=0&&arr[j]>k)
{
arr[j + 1] = arr[j];
j--;

}
arr[j+1] = k;

}
}
void printArray(int arr[], int n)
{
for (int  i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
int array[] = { 64, 25, 12, 22, 11 };
int n = sizeof(array) / sizeof(array[0]);
//	selectionSort(array, n);
insertionSort(array, n);
printArray(array, n);
return 0;
}

由于上述查找插入元素的位置时候,最坏情况需要查找O(i) ,所以可以采用二分查找,来进行查找需要插入的i个数的位置,代码如下:

// A binary search based function to find the position
// where item should be inserted in a[low..high]
int binarySearch(int a[], int item, int low, int high)
{
if (high <= low)
return (item > a[low])? (low + 1): low;

int mid = (low + high)/2;

if(item == a[mid])
return mid+1;

if(item > a[mid])
return binarySearch(a, item, mid+1, high);
return binarySearch(a, item, low, mid-1);
}

// Function to sort an array a[] of size 'n'
void insertionSort(int a[], int n)
{
int i, loc, j, k, selected;

for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];

// find location where selected sould be inseretd
loc = binarySearch(a, selected, 0, j);

// Move all elements after location to create space
while (j >= loc)
{
a[j+1] = a[j];
j--;
}
a[j+1] = selected;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息