插入类排序可以分为三种:直接插入、折半插入、以及希尔排序。
原理暂先忽略,以后再补。
时间复杂度:
直接插入排序:O(n^2)、折半插入排序:O(n^2)、希尔排序:O(n^3/2);
下面是相关的示例:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
/***********************************************************/
// 程序名称:InsertSort.cpp // 程序目的:内部排序法---插入类排序 // 程序来源:数据结构与算法分析(C语言版) P-219 // 日期:2013-9-1 19:15:37 JohnnyHu修改 /***********************************************************/ #include <stdio.h> #include <stdlib.h> #define Error( str ) FatalError( str ) #define FatalError( str ) fprintf( stderr, "%s\n", str ), exit( 1 ) #define MAX 5 typedef int ElementType; void InsertionSort(ElementType a[], int n); void BinarySort(ElementType a[], int n); void ShellSort(ElementType a[], int n); void PrintSort(ElementType a[], int n); int main(void) { ElementType data[MAX] = {96, 44, 39, 75, 88}; printf("排序前元素序列:\n"); PrintSort(data, MAX); //InsertionSort(data, MAX); //BinarySort(data, MAX); ShellSort(data, MAX); printf("排序后元素序列:\n"); PrintSort(data, MAX); return 0; } /************************************************************************/ // 直接插入排序 /************************************************************************/ void InsertionSort(ElementType a[], int n) { ElementType tmp; for (int i = 1; i < n; i++) { tmp = a[i]; // 取出第i个元素 int j = 0; for (j = i; j > 0 && a[j - 1] > tmp; j--) { // 从后往前寻找插入位置 a[j] = a[j - 1]; } a[j] = tmp; // a[i]插入正确位置 } } /************************************************************************/ // 折半插入排序 /************************************************************************/ void BinarySort(ElementType a[], int n) { for (int i = 0; i < n; i++) { int low, high; low = 0; high = i - 1; ElementType theValue = a[i]; // 待插入的元素 while (low <= high) { int mid; mid = (low + high) / 2; if (theValue < a[mid]) high = mid - 1; // 上半区寻找插入位置 else low = mid + 1; } for (int j = i; j > low; j--) a[j] = a[j - 1]; a[low] = theValue; } } /************************************************************************/ // 希尔(插入)排序 /************************************************************************/ void ShellSort(ElementType a[], int n) { int delta; // 增量 for (delta = n / 2; delta >= 1; delta /= 2) { for (int i = delta; i < n; i++) { ElementType tmp = a[i]; // 取出待排序的元素 int j = i - delta; while (j >= 0 && a[j] > tmp) { a[j + delta] = a[j]; j -= delta; } a[j + delta] = tmp; } } } // 打印元素序列 void PrintSort(ElementType a[], int n) { for (int i = 0; i < n; i++) printf("[%d]\t", a[i]); printf("\n"); return; } |
输出结果: