C语言冒泡、插入、选择排序及二分法查找

冒泡、插入、选择排序及二分法查找


冒泡排序

  1. 将两个相邻的元素比较 如果第一个数比第二个数大(小),就交换它们。
  2. 相邻的两个元素从第一对比较到最后一对。
  3. 循环比较,直到全部元素按顺序排列
void bubble_(myType *a,int high)//冒泡排序
{
	int t = 0;
	for (int i = 1; i < high; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (a[i]<=a[j])
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}

插入排序

  1. 从未排好的序列中拿出首元素,并把它赋值给temp变量;
  1. 从排好的序列中,依次与temp进行比较,如果元素比temp大,则将元素后移(实际上放置temp的元素位置已经空出)
  2. 直到找到一个元素比temp小, 将temp放入该位置;
    时间复杂度:o(n^2)
void insert(myType *a,int high)//插入排序
{
	int i,j,t;
	for (i = 1; i < high; ++i)
	{
		t = a[i];
		for (j = i;j > 0 && a[j-1]>t; j--)
		{
			a[j] = a[j-1];
		}
		a[j] = t;
	}

选择排序

  • 每一趟的选择排序就是从未排好顺序的元素中
    选择一个最小的元素,将该元素与这些未排好
    序的元素的第一个元素交换位置
    处理过程
  • 每一轮比较都是j = min+1,且j < N(N元素个数)
  • 如果满足交换条件就交换数据
  • 比较的轮数N-1,每一轮开始min+1
void select(myType *a,int high)//选择排序
{
	int min,t;
	for (int i = 0; i < high; i++)
	{
		min = i;
		for (int j = 1; j < high; j++)
		{
			if (a[j]

二分法查找

  • 如果从文件中读取的记录关键字是有序排 列的,则可以用一种效率更高的查找方法 来实现,即二分查找

基本思路

  • 每次都将关键字与中间的元素对比,如果 不相等再判断关键字范围并移动上下限指 针,继续折半比较
int binary(myType *a,int high)//二分法查找
{
	int mid = 0,low = 0,value;
	printf("Please input need looking for number:\n");
	scanf("%d",&value);
	while(low <= high)
	{
		mid = (low + high)/2;
		if (value == a[mid])
		{
			return mid;
		}
		else if(value > a[mid])
		{
			low = mid + 1;
		}
		else
		{
			high = mid -1;
		}
		
	}
	return -1;
}

打印函数

void print_func(myType *a,int high)
{
	for (int i = 0; i < high; ++i)
	{
		printf("%d\n",a[i] );
	}
}

将分函数调用

int main(int argc, char const *argv[])
{
	int a[]={23,12,5,122,3,235,6,3456,34,1,34,23,4,35,34,534,8,346,234};
	int high = sizeof(a)/4;
	printf("Please select sort mode: 1.bubble\t2.insert\t3.select\n");
	int x;
	scanf("%d",&x);
	switch(x)
	{
		case 1:bubble_(a,high);break;
		case 2:insert(a,high);break;
		case 3:select(a,high);break;
		default :printf("error\n");break;
	}
	printf("The number coordinates are:%d\nif number is '-1' not find\n",binary(a,high) );
	system("pause");
	//print_func(a,high);
	return 0;
}

完整代码

#include 
#define DEBUG0
typedef int myType;
void bubble_(myType *a,int high)//冒泡排序
{
	int t = 0;
	for (int i = 1; i < high; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (a[i]<=a[j])
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}
#ifdef DEBUG1
	for (int i = 0; i < high; ++i)
	{
		printf("%d\n",a[i] );
	}
#endif
}
void insert(myType *a,int high)//插入排序
{
	int i,j,t;
	for (i = 1; i < high; ++i)
	{
		t = a[i];
		for (j = i;j > 0 && a[j-1]>t; j--)
		{
			a[j] = a[j-1];
		}
		a[j] = t;
	}
#ifdef DEBUG1
	for (int i = 0; i < high; ++i)
	{
		printf("%d\n",a[i] );
	}
#endif
}
void select(myType *a,int high)//选择排序
{
	int min,t;
	for (int i = 0; i < high; i++)
	{
		min = i;
		for (int j = 1; j < high; j++)
		{
			if (a[j] a[mid])
		{
			low = mid + 1;
		}
		else
		{
			high = mid -1;
		}
		
	}
	return -1;
}
void print_func(myType *a,int high)
{
	for (int i = 0; i < high; ++i)
	{
		printf("%d\n",a[i] );
	}
}
int main(int argc, char const *argv[])
{
	int a[]={23,12,5,122,3,235,6,3456,34,1,34,23,4,35,34,534,8,346,234};
	int high = sizeof(a)/4;
	printf("Please select sort mode: 1.bubble\t2.insert\t3.select\n");
	int x;
	scanf("%d",&x);
	switch(x)
	{
		case 1:bubble_(a,high);break;
		case 2:insert(a,high);break;
		case 3:select(a,high);break;
		default :printf("error\n");break;
	}
	printf("The number coordinates are:%d\nif number is '-1' not find\n",binary(a,high) );
	//print_func(a,high);
	return 0;
}

你可能感兴趣的:(C)