本文共 3021 字,大约阅读时间需要 10 分钟。
由于比较晚了,那我们今天我们说说插入排序。。。
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
我们这里说说八大排序就是内部排序。
1、插入排序---直接插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,为O(n^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 | #include <stdio.h> #define NUM(a) ( sizeof (a)/ sizeof (*a)) int insertSort( int *arr, const int n) { //型参条件判断 if (NULL == arr || 0 >= n) { return -1; } int i = 0; //用于循环使用 int j = 0; //同上 int k = -1; //用于记录拿出的比较的数据下标 int tmp = -1; //用于记录比较数据 for (i = 1; i < n; i++) { k = i; //记录比较的数据的下标 tmp = arr[k]; //记录比较的数据 //从小到大排序 for (j = i - 1; (0 <= j)&&(tmp < arr[j]); j--) { //条件满足时数据后移 arr[k] = arr[j]; k = j; } arr[k] = tmp; } return 0; } int print_array( const int *arr, const int n) { //型参条件判断 if (NULL == arr || 0 >= n) { return -1; } //遍历数组 int i = 0; for (i = 0; i < n; i++) { printf ( "%d " , *(arr+i)); } printf ( "\n" ); return 0; } int main( void ) { int arr[] = { 12, 51, 15, 16, 33, 11, 99, 52, 16, 5, 33, 18}; printf ( "排序之前:" ); print_array(arr, NUM(arr)); insertSort(arr, NUM(arr)); printf ( "排序之后:" ); print_array(arr, NUM(arr)); return 0; } /* 执行结果: 排序之前:12 51 15 16 33 11 99 52 16 5 33 18 排序之后:5 11 12 15 16 16 18 33 33 51 52 99 */ |
2、插入排序希尔排序
希尔排序(Shell Sort)是插入的一种。是针对直接插入排序的改进。该方法又称缩小排序,因DL.Shell于1959年而得名。
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 | #include <stdio.h> #define NUM(a) ( sizeof (a)/ sizeof (*a)) int insertSort( int *arr, const int n) { //型参条件判断 if (NULL == arr || 0 >= n) { return -1; } int i = 0; //用于循环使用 int j = 0; //同上 int k = -1; //用于记录拿出的比较的数据下标 int tmp = -1; //用于记录比较数据 int gap = n; //增量大小 do { gap = gap / 3 + 1; for (i = gap; i < n; i+=gap) { k = i; //记录比较的数据的下标 tmp = arr[k]; //记录比较的数据 //从小到大排序 for (j = i - gap; (0 <= j)&&(tmp < arr[j]); j-=gap) { //条件满足时数据后移 arr[k] = arr[j]; k = j; } arr[k] = tmp; } } while (1 < gap); return 0; } int print_array( const int *arr, const int n) { //型参条件判断 if (NULL == arr || 0 >= n) { return -1; } //遍历数组 int i = 0; for (i = 0; i < n; i++) { printf ( "%d " , *(arr+i)); } printf ( "\n" ); return 0; } int main( void ) { int arr[] = { 12, 51, 15, 16, 33, 4, 8, 19, 31, 11, 99, 52, 16, 5, 33, 18}; printf ( "排序之前:" ); print_array(arr, NUM(arr)); insertSort(arr, NUM(arr)); printf ( "排序之后:" ); print_array(arr, NUM(arr)); return 0; } /* 运算结果: 排序之前:12 51 15 16 33 4 8 19 31 11 99 52 16 5 33 18 排序之后:4 5 8 11 12 15 16 16 18 19 31 33 33 51 52 99 */ |