排序算法入门:直接插入排序
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤2~5
输入要求
多组输入。
每行输入一组用空格分隔的数字,第一个数字N表示接下来会跟上多少个数字。(100个以内)
输出要求
将后面的N个数字排序,并且输出每一趟排序的结果,用空行隔开。
输入输出
5 5 4 3 2 1
4 5 3 2 1
3 4 5 2 1
2 3 4 5 1
1 2 3 4 5
#include <iostream>
using namespace std;
void in_place(int a[], int n){
for(int i=1; i<n; i++){
if (a[i]< a[i-1]){
int temp = a[i];
for (int j=i; j>=0; j--){
if(j>0 && a[j-1]>temp) {
//保证最前面的数字会被改变
a[j]=a[j-1];
}
else {
a[j]=temp;
break;
}
}
}
for(int j=0; j<n; j++){
if(j==n-1){
printf("%d\n",a[j]