本文共 1918 字,大约阅读时间需要 6 分钟。
link网址为大神的图解分析,有助于理解各种排序算法。
/* * 所有排序均为升序排列 * 图解分析可参考:http://www.cnblogs.com/skywang12345/p/3603935.html */#include#include #define LEN(array) (sizeof(array)/sizeof(array[0]))#define swap(a,b) (a^=b,b^=a,a^=b)/**打印数组元素**/void print_array(int arr[], int arr_length){ int i; for(i=0;i arr[i+1]) { swap(arr[i], arr[i+1]); /*交换,大的往后移动*/ flag = 1; } } if(0 == flag){ break; } }}/**插入排序**link:http://www.cnblogs.com/fzhe/archive/2013/01/25/2871699.html****直接插入排序的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。**开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,**将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。****关键的两句话:1.元素拿出来;2.符合条件的后移**直接插入排序的时间复杂度是O(N2)。**直接插入排序是稳定的算法,它满足稳定算法的定义。**/void insert_sort(int arr[], int arr_length){ int i,j,temp; for(i=1;i =0 && temp =1) { for(i=gap;i =0 && temp =right) return; temp = arr[left]; //temp中存的就是基准数 i = left; j = right; while(i != j) { //先从右边开始找 第一个 小于temp的数 while(arr[j] >= temp && i = a[l]) { break; // 调整结束 } else { a[c]=a[l]; a[l]=tmp; } }}//堆排序(小到大)void heap_sort(int arr[], int arr_length){ int i; // 从(n/2-1) --> 0逐次遍历。遍历之后,得到的数组实际上是一个(最大)二叉堆。 for(i=arr_length/2-1;i>=0;i--) { maxheap_down(arr,i,arr_length-1); } for(i=arr_length-1;i>0;i--) { swap(arr[0], arr[i]); // 交换a[0]和a[i]。交换后,a[i]是a[0...i]中最大的。 maxheap_down(arr,0,i-1); // 调整a[0...i-1],使得a[0...i-1]仍然是一个最大堆。 }}/**归并排序 **link:http://www.cnblogs.com/skywang12345/p/3602369.html **将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列, **再将这些数列两两合并;得到若干个长度为4的有序数列,再将它们两两合并;直接合并成一个数列为止。 **///2. 将一个数组中的两个相邻有序区间合并成一个(合)void Merge(int a[],int low,int mid,int high) { int *arr; int i,j,p; i = low; j = mid+1; p = 0; arr = (int *)malloc((high-low+1)*sizeof(int));//申请空间 临时存放数据 if(NULL == arr) { fprintf(stderr,"malloc fault"); } while(i<=mid && j<=high) { arr[p++] = (a[i]