排序算法之插入排序
2016-10-29 23:18
211 查看
插入排序算法跟我们平时打扑克一样,将元素插入到已经排序好的数组中。每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。当元素的大部分顺序排好的时候,适合采用插入排序,代码如下:
由于上述查找插入元素的位置时候,最坏情况需要查找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;
}
}
#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;
}
}
相关文章推荐
- 排序算法-插入排序
- 排序算法(二)、插入排序 —— 直接插入排序 和 希尔排序
- 排序算法系列三(插入排序)
- 排序算法——插入排序
- 数据结构(C#)_排序算法(插入排序)
- 算法—比较两种排序算法:选择排序和插入排序(详细)
- 【排序算法】之插入排序的实现
- 排序算法(三)——插入排序
- 排序算法-插入排序
- 排序算法——二分插入排序
- C Tips: 排序算法:插入排序(Insert sorting)
- 排序算法之 插入排序
- 排序算法之“选择排序-冒泡排序-插入排序”
- 排序算法之插入排序
- 排序算法之插入排序
- 排序算法之插入排序
- 排序算法-------插入排序
- 排序算法之插入排序
- 《排序算法》——归并排序,插入排序(Java)
- 排序算法(冒泡排序、选择排序、插入排序)