插入排序(摘自百科):插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
插入排序主要分为直接排序和折半排序,本质的思想是一致的,只是实现的思路不一致。直接排序是从右到左进行比较进行排序;而折半排序就是在已排序的基础上对半进行比较,即比较A[i-2/2]与A[i]进行比较定位。
直接排序的方法:
(1)默认a[0]是排好序的。(显然废话咯)
(2)分别对a[1-n]进入插入咯。即每次循环将a[i]插入到a[0-i-1]的有序区中
(3)插入进去后将比a[i]大的数值进行a[i+1]=a[i]操作
C++代码实现:
#include<iostream> using namespace std; void insertionSort(int *insertion, int num); int main() { int num;//输入排序数组大小 cout << "please inputh the num:"; cin >> num; cout << endl; int * insertion = new int[num]; cout << "please input the integers:" << endl; for (int i = 0; i < num; i++) cin >> insertion[i]; insertionSort(*&insertion, num); system("pause"); delete[]insertion; return 0; } void insertionSort(int *insertion, int num) { int j,tmp; for (int i = 1; i < num; i++) { for ( j = i - 1; j >= 0; j--) { if (insertion[j] < =insertion[i]) { break; } } if (j != (i - 1))//判断是否需要插入 { tmp = insertion[i]; //从后向前移动 for (int k = i-1 ; k >=j; k--) { insertion[k + 1] = insertion[k]; } insertion[j + 1] = tmp; } } for (int i = 0; i < num; i++) { cout << insertion[i] << endl; } }
参考资料见大神:http://www.cnblogs.com/fanyong/archive/2012/03/23/2413553.html
折半排序:
#include<iostream> using namespace std; void insertionSort(int *insertion, int num); void insertionSort2(int *insertion, int num); int main() { int num;//输入排序数组大小 cout << "please inputh the num:"; cin >> num; cout << endl; int * insertion = new int[num]; cout << "please input the integers:" << endl; for (int i = 0; i < num; i++) cin >> insertion[i]; insertionSort2(*&insertion, num); for (int i = 0; i < num; i++) { cout << insertion[i] << endl; } system("pause"); delete[]insertion; return 0; } void insertionSort(int *insertion, int num) { int j,tmp; for (int i = 1; i < num; i++) { for ( j = i - 1; j >= 0; j--) { if (insertion[j] <= insertion[i]) { break; } } if (j != (i - 1))//判断是否需要插入 { tmp = insertion[i]; //从后向前移动 for (int k = i-1 ; k >=j; k--) { insertion[k + 1] = insertion[k]; } insertion[j + 1] = tmp; } } } void insertionSort2(int *insertion, int num)//折半排序 { int low, high,mid; int temp; for (int i = 1; i < num; i++) { temp = insertion[i]; low = 0; high = i - 1; mid = (high + low) / 2; while (low<=high) { if (insertion[i] <insertion[mid]) { high = mid - 1; mid = (high+ low) / 2; } else { low = mid + 1; mid = (high + low) / 2; } } cout << i<<" "<<low << " " << mid << " " << " " << high << endl; for (int j = i - 1; j >=low; j--) { insertion[j + 1] = insertion[j]; } insertion[low] = temp; } }