码迷,mamicode.com
首页 > 编程语言 > 详细

一般排序算法总结与模板

时间:2014-12-03 15:48:07      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:冒泡排序   插入排序   合并排序   二分搜索   排序算法   

一般排序算法总结与模板

主要包括冒泡、插入、合并排序和两种二分查找的实现。

bubuko.com,布布扣


冒泡排序:

bubuko.com,布布扣


插入排序:

bubuko.com,布布扣

合并排序:

bubuko.com,布布扣


#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;
} 



一般排序算法总结与模板

标签:冒泡排序   插入排序   合并排序   二分搜索   排序算法   

原文地址:http://blog.csdn.net/a656343072/article/details/40983137

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!