插入排序
即将所需排序的数组分为有序和无序两个部分且有序区在前。每次从无序区中取出一个元素插到有序区的适当位置。
如果需要排序的元素插入有序区的中间,则在插入元素后有序区的每一位元素后移。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void InsertSort(int *p,int n){ int temp; int sorted; int i,j; for(i = 1 ; i < n ; i++){ sorted = i-1; temp = p[i]; while(sorted >= 0 && p[sorted] > temp){ p[sorted+1] = p[sorted]; sorted--; } p[sorted+1] = temp; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <stdio.h> #include <stdlib.h> void InsertSort(int *p,int n){ int temp; int sorted; int i,j; int *s = p,*e = p+n-1; for( ; s < e ; s++){ sorted = s-p-1; temp = *s; while(sorted >= 0 && *(p+sorted) > temp){ *(p+sorted+1) = *(p+sorted); sorted--; } *(p+sorted+1) = temp; } }
|
归并排序
归并排序是利用递归不断将数组分成两份直到分成每个数组一个元素。然后将分好的有序小数组两两比较进行合并。
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
| #include <stdio.h> #include <stdlib.h>
void merge(int arr[],int temp[],int left,int mid,int right){ int l_pos = left; int r_pos = mid+1; int pos = left; while(l_pos <= mid && r_pos <= right){ if(arr[l_pos] < arr[r_pos]){ temp[pos++] = arr[l_pos++]; }else{ temp[pos++] = arr[r_pos++]; } }
while(l_pos <= mid){ temp[pos++] = arr[l_pos++]; } while(r_pos <= right){ temp[pos++] = arr[r_pos++]; } while(left <= right){ arr[left] = temp[left]; left++; } } void mergeSort(int arr[],int temp[],int left,int right){ if(left < right){ int mid = (left+right) / 2; mergeSort(arr,temp,left,mid); mergeSort(arr,temp,mid+1,right); merge(arr,temp,left,mid,right); } }
void showArr(int arr[],int n){ int i; for(i = 0 ; i < n ; i++){ printf("%d",arr[i]); } printf("\n"); } int main(){ int arr[] = {5,7,4,1,6,9,8,2,3}; int n = 9; int *temp = (int*)malloc(sizeof(int)); showArr(arr,n); if(temp){ mergeSort(arr,temp,0,n-1); }else{ printf("ERROR!"); } showArr(arr,n); }
|
堆排序
堆的定义:若一个数列是堆,则r1必定是数列中的最小值或最大值,并且满足(ri <= r2i && ri <= r2i+1) || (ri >= r2i && ri >= r2i+1)。
如图:1
堆排序即利用堆的特性对记录序列进行排序的一种排序方法。
具体步骤:
- 先按所需排序的序列建立大顶堆,选出堆顶元素即关键字最大的记录
- 将关键字最大的记录与序列中最后一个元素交换
- 重新将前n-1个元素调整为大顶堆
- 反复过程,直至有序
初始建堆:
我们以序列[40, 55, 73, 12, 98, 27]为例。
由无序序列建成大顶堆的过程是“自下而上”进行筛选的过程。数组有效元素下标从1开始,这样每一个叶结点的两个子节点下标分别为2n和2n+1。