一般排序算法总结与模板
主要包括冒泡、插入、合并排序和两种二分查找的实现。
冒泡排序:
插入排序:
合并排序:
#include <stdio.h> #include <stdlib.h> #include <errno.h> int a[]={223, 34, 23, 2, 21, 55, 87, 533 , 213, 111}; //int a[]={2, 21, 23, 34, 55, 87, 111, 213, 223, 533}; //int a[]={533, 223, 213, 111, 87, 55, 23, 34 , 21, 2}; //int *a; /******************************************************************************* #Function : MaopaoSort #Description : 冒泡排序 一次循环冒泡一个最大或最小值 #Parameter : a:待排序数组 size:数组大小 #Return : NULL #AuthorAndData : huangzhigang 20141203 *******************************************************************************/ void MaopaoSort(int a[], int size) { int i,j; int temp; for(i=0; i<size; i++) //控制排序的次数 与已经冒泡数个个数 for(j=0; j<size-i-1; j++) //从下往上冒泡 { if(a[j] > a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } /******************************************************************************* #Function : InsertSort #Description : 插入排序 #Parameter : a:待排序数组 size:数组大小 #Return : NULL #AuthorAndData : huangzhigang 20141203 *******************************************************************************/ void InsertSort(int *a, int size) { int i,j; int temp; for(i=0; i<size-1; i++) { j= i+1; temp = *(a+j); //从第二个数开始依次插入 while(*(a+j-1) > temp && j>0) { *(a+j) = *(a+j-1); j--; } *(a+j) = temp; } } /******************************************************************************* #Function : DevisionSearch1 #Description : 递归二分搜索 #Parameter : a:待搜索数组 left:左边界 right:右边界 value:搜索值 #Return : 返回搜索到的数组下标 #AuthorAndData : huangzhigang 20141203 *******************************************************************************/ int DevisionSearch1(int a[], int left, int right, int value) { int mid = left + (right - left)>>1; //优化 避免 溢出 if(a == NULL) {perror("a is Null"); exit(0);} if(a[mid] == value) { return mid; //数组中有与value相等的数 返回当前位置 } else if(a[mid] > value && mid > left) { DevisionSearch(a,left,mid-1,value); } else if(a[mid] < value && mid < right) { DevisionSearch(a,mid+1,right,value); } else { return -1; //没有搜索到返回-1 } } /******************************************************************************* #Function : DevisionSearch2 #Description : while循环中进行二分搜索 #Parameter : a:待搜索数组 value:搜索值 #Return : 返回搜索到的数组下标 #AuthorAndData : huangzhigang 20141203 *******************************************************************************/ int DevisionSearch2(int a[], int left, int right, int value) { //在有序表R[0..n]中进行二分查找,成功时返回结点的位置,失败时返回零 int mid;//置当前查找区间上、下界的初值 while(left <= right){ //当前查找区间R[low..high]非空 mid=(left+right)/2; if(a[mid] == value) return mid; //查找成功返回 if(a[mid] > value) right = mid-1; //继续在a[low..mid-1]中查找 else left = mid+1; //继续在a[mid+1..high]中查找 } return 0; //当low>high时表示查找区间为空,查找失败 } /******************************************************************************* #Function : MergeArray #Description : 将两个有序数组合并成一个有序数组 数组1 a[left~mid] 数组2 a[mid+1~right] 思想:从小到大将两个数组中的元素逐步加入到a中(left~right) #Parameter : a:待排序数组 left:左边界 right:右边界 value:搜索值 #AuthorAndData : huangzhigang 20141203 *******************************************************************************/ void MergeArray(int *a, int left, int right) { if(a == NULL) {perror("a is Null"); exit(0);} int mid = (int)(left + right)/2; int left_len = mid-left+1, right_len = right - mid; int i, pl=0, pr=0; int *array_left = (int *)malloc(left_len *sizeof(int)); //申请临时空间 存放数组 int *array_right = (int *)malloc(right_len *sizeof(int)); for(i=0; i<left_len; i++) *(array_left + i) = *(a + left +i); for(i=0; i<right_len; i++) *(array_right + i) = *(a+mid+i+1); for(i = left; i <=right; i++) { if(pl <= left_len-1 && pr <= right_len-1) //两个数组都有数的情况 { if(array_left[pl] <= array_right[pr]) { a[i] = *(array_left+pl++); } else { a[i] = *(array_right+pr++); } } else //有一个数组的数已经分配完毕 { if(pl > left_len-1) { a[i] = *(array_right+pr++); } else if(pr > right_len-1) { a[i] = *(array_left+pl++); } } } free(array_left); free(array_right); } /******************************************************************************* #Function : MergeSort #Description : 合并排序 (将数组划分成两块 递归排好序后在合并) #Parameter : a:待排序数组 left:左边界 right:右边界 #Return : NULL #AuthorAndData : huangzhigang 20141203 *******************************************************************************/ void MergeSort(int *a, int left, int right) { int mid =(int)(left+right)/2; if(left < right) { MergeSort(a, left, mid); MergeSort(a, mid+1, right); MergeArray(a,left, right); } } int main() { int i; int value =23; //InsertSort(a, 10); //MaopaoSort(a,10); MergeSort(a, 0, 9); //i =DevisionSearch1(a, 0, 9, value); //printf("%d in %d of the array a[]\n",value,i); for(i=0; i<10; i++) { printf("%d ",*(a+i)); } printf("\n"); return 0; }