涉及知识点:
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;
}