标签:插入排序 折半插入排序 2路插入排序 静态链表插入排序 希尔排序
// InsertSort.cpp : 定义控制台应用程序的入口点。 //插值排序 #include "stdafx.h" #include <cstdlib> static int testArray[] = {0,55,33,22,99,77,66,11,44,88,9};//11个 //数组0号位置 作为 哨兵... //升序排序 void insertSort(int * array,int num){ for (int i = 2; i <= num; i++){ if (array[i] < array[i-1]){ array[0] = array[i];//复制哨兵. array[i] = array[i-1]; int j = i - 2; for (; array[j] > array[0]; j--){//后移 array[j+1] = array[j]; } array[j+1] = array[0]; } } } //折半插入排序 void halfInsertSort(int *array,int num){ for (int i = 2; i <= num; i++){ array[0] = array[i];//复制哨兵 int low = 1; int high = i-1; while (low <= high){ int mid = (low + high)/2; if (array[mid] > array[0]){ high = mid -1; } else{ low = mid +1; } } int j = i - 1; for (; j >= high+1; j--){ array[j+1] = array[j]; } array[j+1] = array[0]; } } //2路插入排序 void p2_InsertSort(int * array,int num){ int size = sizeof(int) * (num); int * p = (int *)malloc(size); int first = 0; int final = 0; p[0] = array[1]; for (int i = 2; i <= num; i++){ if (array[i] < p[first]){ first = (first -1 + num) % num; p[first] = array[i]; } else if(array[i] > p[final]){ final = (final +1)% num; p[final] = array[i]; } else{ int j = final++; for (; p[j] > array[i] ; ){ int index = (j+1)%num; p[index] = p[j]; j = (j-1 + num ) % num; } p[(j+1)%num] = array[i]; } } for (int i = 0; i < num; i++){ int index = (first +i) % num; array[i+1] = p[index]; } free(p); } void randomArray(){ for (int i = 1; i <= 10; i++){ testArray[i] = rand() % 100; } } void printArray(){ for (int i = 1; i < 11; i++){ printf("%d\t",testArray[i]); } printf("\n"); } //静态表插入排序, //不需要移动,只需要更改 next “指针” #define SIZE 100 struct SLNode{ int data; int next; }; struct SLTable{//静态链表 SLNode base[SIZE]; int len; }; //初始化静态链表 void initTable(SLTable * t,int * array,int num){ for (int i = 1; i <= num; i++){ t->base[i].data = array[i]; } t->base[1].next = 0; t->base[0].next = 1; t->base[0].data = INT_MAX; t->len = num; } void tableInsertSort(SLTable * t,int * array,int num){ for (int i = 2; i <= num; i++){ int pre = 0; int next = t->base[0].next; while (next != 0){ SLNode node = t->base[next]; if (node.data > array[i]){ break; } pre = next; next = t->base[next].next; } t->base[i].next = t->base[pre].next; t->base[pre].next = i; } } void printTable(SLTable t){ int next = t.base[0].next; while (next != 0){ printf("%d\t",t.base[next].data); next = t.base[next].next; } } //shell 排序 //缩小增量排序 void shellInsert(int * array,int num,int dt){ for (int i = dt + 1; i <= num; i++){ if (array[i] < array[i-dt]){ array[0] = array[i]; int j = i - dt; for (;j > 0 && array[j] > array[0] ; j-=dt){ array[j+dt] = array[j]; } array[j+dt] = array[0]; } } } static int dtArray[] = {5,3,2,1}; void shellSort(int * array,int num){ for (int i = 0; i < 4; i++){ shellInsert(array,num,dtArray[i]); } } int _tmain(int argc, _TCHAR* argv[]) { //srand(5000); //插入排序 printf("----------------插入排序---------------\n"); randomArray(); insertSort(testArray,10); printArray(); //二分插入排序 printf("----------------二分插入排序---------------\n"); randomArray(); halfInsertSort(testArray,10); printArray(); //二路插入排序 printf("----------------二路插入排序---------------\n"); randomArray(); p2_InsertSort(testArray,10); printArray(); printf("----------------静态链表插入排序---------------\n"); randomArray(); SLTable t; initTable(&t,testArray,10); tableInsertSort(&t,testArray,10); printTable(t); //shell sort printf("----------------希尔排序---------------\n"); randomArray(); shellSort(testArray,10); printArray(); return 0; }
标签:插入排序 折半插入排序 2路插入排序 静态链表插入排序 希尔排序
原文地址:http://blog.csdn.net/fuming0210sc/article/details/45439491