//Function.h void bubble_sort(int Array[],int N);//冒泡排序 void Quick_sqort(int Arr[],int begin,int end);//快速排序 void selection_sort(int Array[],int N);//选择排序 void heap_sort(int *array, int n);//堆排序 void merge_sort(int Arr[],int begin,int end);//归并排序 int binary_search(int Array[],int N,int num);//二分查找
//Main.cpp #include<stdio.h> #include"Function.h" int main() { int Array[1000]={0}; int N,k,index; int i; printf("请输入待排序数字个数:"); scanf("%d",&N); printf("请输入待排序数字:"); for(i=0;i<N;i++) scanf("%d",&Array[i]); /////排序(从小到大) //bubble_sort(Array,N); Quick_sqort(Array,0,N-1); //selection_sort(Array,N); //merge_sort(Array,0,N-1); //heap_sort(Array, N); printf("排序过后的数字:"); for(i=0;i<N;i++) printf("%d ",Array[i]); ///////// printf("\n请输入待查找的数字:");scanf("%d",&k); index=binary_search(Array,N,k);//升序数组Array[]中二分搜索 if(index>0) printf("这是第%d个数\n",index+1); else printf("没有该数字"); return 0; }
#include"Function.h" void bubble_sort(int Array[],int N)//冒泡排序(升序) { int i,j,temp; for(i=0;i<N;i++)//第i次起泡,共起泡N次 { for(j=1;j<N-i;j++)//第i次将最大数起泡到Array[N-i-1] if(Array[j-1]>Array[j])//若能,每次相邻比较后,将较大数冒泡到Array[j] { temp=Array[j-1]; Array[j-1]=Array[j]; Array[j]=temp; } } }
#include"Function.h" //快速排序 int partition(int Arr[],int be,int en)//选取极端的测例:5 4 3 2 1 排成小到大 { int i,j; int temp; i=be+1;//枢轴在be位置 j=en; while(i<=j)//注意"<="而不是"<"//当i==j时说明该次划分只剩两个数,还得继续划分(定位j),否则while之后的代码会打乱排好的序 { //be元素是枢轴,在[be+1~en]范围内搜索 while(i<=en &&Arr[i]<=Arr[be]) i++;//从i位置开始找到比枢轴Arr[be]大的 while(j> be &&Arr[j]>=Arr[be]) j--;//从j。。。。。。。。。。。。 小的 if(i<j)///两头大小互换/// { temp=Arr[i]; Arr[i]=Arr[j]; Arr[j]=temp; } } temp=Arr[be]; //当i>j,i总会在跑到第一个Arr[i]>Arr[begin]处停下来或到en+1(出范围[be+1~en]) Arr[be]=Arr[j]; // j总会在跑到第一个Arr[j]<Arr[begin]处停下来或到be (出范围[be+1~en]) Arr[j]=temp; //与枢轴交换的是Arr[j],必须保证j的安全([be~en]内) return j;//新的枢轴下标 } void Quick_sqort(int Arr[],int begin,int end) { if(begin<end)//待排序数列:起点下标>=终点下标,不再划分 { int mid=partition(Arr,begin,end); Quick_sqort(Arr,begin,mid-1); Quick_sqort(Arr,mid+1,end); } }
#include"Function.h" void selection_sort(int Array[],int N)//选择排序(升序) { int i,j,k,temp; for(i=0;i<N;i++)//为下标为i的数组元素寻找最小值(i及i之后部分中) { k=i;//k用于标记当前一轮中最小值的下标 for(j=i+1;j<N;j++) if(Array[j]<Array[k]) k=j; temp=Array[i]; Array[i]=Array[k]; Array[k]=temp; } }
#include"Function.h" //堆排序 //array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度 //本函数功能是:根据数组array构建大根堆 void HeapAdjust(int array[], int i, int nLength) { int nChild; int nTemp; for (nTemp=array[i]; 2*i+1<nLength; i=nChild) { //子结点的位置=2*(父结点位置)+1 nChild=2*i+1; //得到子结点中较大的结点 if (nChild<nLength-1 &&array[nChild + 1]>array[nChild]) ++nChild; //如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点 if(nTemp<array[nChild]) { array[i]=array[nChild]; array[nChild]= nTemp; } else// 否则退出循环 break; } } void heap_sort(int array[],int length)// 堆排序算法 { int tmp,i; // 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素 //length/2-1是第一个非叶节点,此处"/"为整除 for (i=(length-1)/2; i>=0; --i) HeapAdjust(array, i, length); //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素 for (i=length-1; i>0; --i) { // 把第一个元素和当前的最后一个元素交换, // 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的 // Swap(&array[0], &array[i]); tmp = array[i]; array[i] = array[0]; array[0] = tmp; //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值 HeapAdjust(array, 0, i); } }
#include"Function.h" //归并排序(升序) void merge(int Arr[],int begin,int mid,int end)//合并 { int i,j,k=0; int List[1000]={0};//临时数组 for(i=begin,j=mid+1; i<=mid&&j<=end;)//限定范围i-[begin~mid],j-[mid+1~end] if(Arr[i]<Arr[j]) List[k++]=Arr[i++]; //挑选较小者入List[] else List[k++]=Arr[j++]; //条件i<=mid&&j<=end不再满足 while(i<=mid) List[k++]=Arr[i++]; while(j<=end) List[k++]=Arr[j++]; k=0; for(i=begin; i<=end; i++) Arr[i]=List[k++];//临时数组中数据回存Arr[]数组 } void merge_sort(int Arr[],int begin,int end)//归并排序(递归:不断调用自身) { int mid; if(begin<end) { mid=(begin+end)/2;//划分 merge_sort(Arr,begin,mid); merge_sort(Arr,mid+1,end); merge(Arr,begin,mid,end);//合并 } }
#include"Function.h" int binary_search(int Array[],int N,int num)//二分查找 { int low,high,mid; low=0; high=N-1; while(low<=high) { mid=(low+high)/2; if(Array[mid]==num)///查找到num return mid; else if(Array[mid]>num) high=mid-1; else low=mid+1; } return -1;//未找到 }