一般排序算法总结与模板
主要包括冒泡、插入、合并排序和两种二分查找的实现。
冒泡排序:
插入排序:
合并排序:
#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;
}