在原文上进行了修改,更加全面一点,借鉴。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COMPARE(x,y) (((x) < (y)) ? -1 : ((x) == (y)) ? 0 : 1)
//产生随机数组
void gen_array(int arr[],int n)
{
int i;
unsigned sr = time(NULL); //用当前时间做随机数种子
srand(sr); //初始化随机数
for(i=0;i<n;i++)
arr[i]=1+rand()%100;
}
void print(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%6d",a[i]);
printf("\n");
}
//冒泡排序
void BubleSort(int a[],int n)
{
int i,j,x;
for(i=0;i<n;i++)
{
for(j=1;j<n-i;j++)
{
if(a[j-1]>a[j])
{
x=a[j];
a[j]=a[j-1];
a[j-1]=x;
}
}
}
}
//快速排序
void QuickSort(int a[], int left, int right)
{
if (left < right)
{
int i = left, j = right, x = a[left];
while (i < j)
{
while(i < j && a[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
a[i++] = a[j];
while(i < j && a[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
a[j--] = a[i];
}
a[i] = x;
QuickSort(a, left, i - 1); // 递归调用
QuickSort(a, i + 1, right);
}
}
//插入排序
void InsertSort(int arr[], int n)
{
int i,j,temp;
for (i = 1; i < n; i++)
{
temp=arr[i];
j=i;
while(j>0 && arr[j-1]>temp)
{
arr[j] = arr[j-1];
j--;
}
arr[j]=temp;
}
}
//折半插入排序
int BinaryInsertionSort(int array[], int n)
{
int i, j, low, high, mid;
int temp;
if(array == NULL) {
return -1;
}
for(i = 1; i < n; i++) {
low = 0;
high = i-1;
temp = array[i];
//跳出循环时low为插入位置
while(low <= high) {
mid = (low + high) / 2;
//若比中间记录小,则去左区间查找
if(array[mid] > temp) {
high = mid - 1;
} else {
//否则去右区间查找
low = mid + 1;
}
}
//将插入位置到待插入元素的位置上的元素整体向后移动一个位置
for(j = i; j > low; j--) {
array[j] = array[j-1];
}
array[low] = temp;
}
return 0;
}
//选择排序
void SelectSort(int arr[],int n)
{
int i,j,k,temp;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(arr[j]<arr[k]) k = j;
}
if(k>i)
{
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
//折半查找
/* 递归代码 */
int binsearch(int list[], int searchchnumm, int left, int right)
{
int middle;
if(left <= right) {
middle = (left + right) / 2;
switch(COMPARE(list[middle], searchchnumm)) {
case -1:
return binsearch(list, searchchnumm, middle + 1, right);
break;
case 0:
return middle;
break;
case 1:
return binsearch(list, searchchnumm, left, middle - 1);
break;
default:
break;
}
}
return -1;
}
int main()
{
int array[10];
int len = sizeof(array)/sizeof(int);
int ch;
int searchelement;
int finalsearch;
while(1)
{
gen_array(array,len);
printf("自动生成10位数组:\n");
print(array,len);
printf("请选择排序方法:\n");//显示菜单
printf("\t0 退出\n\t1 冒泡排序\n\t2 快速排序\n\t3 插入排序\n\t4 选择排序\n\t5 折半插入排序\n请输入你选择的排序方式>>");
scanf("%d",&ch);
switch(ch)
{
case 0:
return 0;
case 1:
BubleSort(array,len);
printf("冒泡排序:\n");
print(array,len);
break;
case 2:
QuickSort(array,0,len-1);
printf("快速排序:\n");
print(array,len);
break;
case 3:
InsertSort(array,len);
printf("插入排序:\n");
print(array,len);
break;
case 4:
SelectSort(array,len);
printf("选择排序:\n");
print(array,len);
break;
case 5:
BinaryInsertionSort(array,len);
printf("折半插入排序:\n");
print(array,len);
break;
default:
break;
}
printf("请输入要查询的元素:");
scanf("%d",&searchelement);
finalsearch = binsearch(array, searchelement, 0, len);
if(finalsearch == -1){
printf("该元素在数组中不存在!\n");
}else{
finalsearch+=1;
printf("该元素位于数组的第%d位\n", finalsearch);
}
system("pause");
system("cls");
}
}
原文摘自:https://blog.csdn.net/relaying/article/details/52618814