排序_交换_随机

涉及知识点:

1. 冒泡排序

2. 选择排序

3. 不使用第三个变量,交换两个变量

4. 随机数组生成

5. 预定义变量


/************************************************************************
* 名  Sort.c
* 功  能:顺序表
* 描  述:排序算法
* 作  者:JarvisChu
* 时  间:2012-10-22
* 修  订:无。
************************************************************************/

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>

#define BUBBLE_SORT
//#define SELECT_SORT

typedef int SWAP_TYPE;


//交换两个数,不使用第三个变量
void swap(int &a,int &b,SWAP_TYPE type)
{
	switch(type)
	{
	case 1:
		//利用加减法
		a = a + b;
		b = a - b;
		a = a - b;
		break;
	case 2:
		//利用一个数异或本身等于0和异或运算符合交换率
		a = a ^ b;
		b = a ^ b;
		a = a ^ b;
		break;
	case 3:
		//乘除
		a = a * b; 
		b = a / b; 
		a = a / b;
		break;
	case 4:
		//不常见方法1
		a = a + b - (b = a);
		break;
	case 5:
		//不常见方法2
		b = a + (a = b)*0;
		break;
	default:
		break;
	}	
}


//生成随机数组
void RandomArray(int arr[], int size)
{
	int i;
	time_t t;
	srand((unsigned)time(&t));               //随机时间种子  stdlib.h 中
	
	for(i=0;i<size;i++)
	{
		arr[i] = rand()%100;				//[0, RAND_MAX(0x7fff)]间的随机整数    
	}	
}

//打印数组
void Print(int arr[], int size)
{
	int i;
	for(i=0;i<size;i++)
	{
		printf("%-4d",arr[i]);
	}
	printf("\n");
}

//冒泡排序
void BubbleSort(int* arr, int size)
{
	int i,j;
	for(i=0;i<size-1;i++)					//控制排序趟数,size-1 趟
	{
		for(j=0;j<size-i;j++)
		{	
			if(arr[j]>arr[j+1])				//从小到大排序
			{
				swap(arr[j],arr[j+1],1);		//交换两个数	
			}
		}
	}
}

//选择排序
void SelectSort(int* arr,int size)
{
	int i,j;
	for(i=0;i<size;i++)
	{
		for(j=i+1;j<size;j++)
		{
			if(arr[i]>arr[j])
			{
				swap(arr[i],arr[j],2);
			}
		}
	}

}


int main()
{
	int arr[10];

	RandomArray(arr,10);		//生成随机数组

	Print(arr,10);				//打印原始数组

#ifdef BUBBLE_SORT
	BubbleSort(arr,10);
#else
	SelectSort(arr,10);
#endif

	
	Print(arr,10);

	printf("-----------------------\n");

	//测试交换
	int a = 10,b = 20;
	swap(a,b,1);
	printf("%d  %d\n",a,b);
	swap(a,b,3);
	printf("%d  %d\n",a,b);
	swap(a,b,4);
	printf("%d  %d\n",a,b);
	swap(a,b,5);
	printf("%d  %d\n",a,b);

	printf("-----------------------\n");
	printf("%s\n %s %s\n",__FILE__,__DATE__,__TIME__);

	return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值