简单插入排序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main (void) {
int i, j;
int arr[100];
int num;
while (scanf ("%d", &num) != EOF) {
for (i = 1;i <= num;i++) {
scanf ("%d", &arr[i]);
}
for (i = 2;i <= num;i++) {
if (arr[i] < arr[i-1]) {
arr[0] = arr[i];
for (j = i-1;arr[j] > arr[0];j--) {
arr[j+1] = arr[j];
}
arr[j+1] = arr[0];
}
}
for (i = 1;i <= num;i++) {
printf ("%d ", arr[i]);
}
printf ("\n");
}
return 0;
}
二分插入排序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main (void) {
int i, j;
int num;
int arr[100];
while (scanf ("%d", &num) != EOF) {
for (i = 1;i <= num;i++) {
scanf ("%d", &arr[i]);
}
for (i = 2;i <= num;i++) {
int low = 1;
int high = i-1;
arr[0] = arr[i];
int m;
while (low <= high) {
m = (low + high) /2;
if (arr[m] > arr[0]) {
high = m-1;
}
else {
low = m+1;
}
}
for (j = i-1;j >= high+1;j--) {
arr[j+1] = arr[j];
}
arr[j+1] = arr[0];
}
for (i = 1;i <= num;i++) {
printf ("%d ", arr[i]);
}
printf ("\n");
}
return 0;
}
二路插入排序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(void) {
int num;
int i, j;
int arr[5];
while (scanf("%d", &num) != EOF) {
for (i = 1; i <= num; i++) {
scanf("%d", &arr[i]);
}
int first = 0;
int final = 0;
int *p = (int*)malloc(sizeof (int)* num);
p[first] = arr[1];
for (i = 2; i <= num; i++) {
if (arr[i] > p[final]) {
p[++final] = arr[i];
}
else if (arr[i] < p[first]) {
first = (first - 1 + num) % num;
p[first] = arr[i];
}
else {
for (j = final; arr[i] < p[j]; j = ((j + num) % num) - 1) {
p[j + 1] = p[j];
}
p[j + 1] = arr[i];
final++;
}
}
for (i = 0; i < num; i++) {
arr[i + 1] = p[(first + i + num) % num];
}
for (i = 1; i <= num; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
return 0;
}