数据结构 排序和查找
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int ITEMNUM = 100;
#define ElemType int
//冒泡排序
void Bubblesort(ElemType R[],int n,int &comp_num,int &move_num)
{
?int i,j,flag=1;???? //當flag為0,則停止排序
?ElemType temp;
?for(i = 0;i < n-1;i++){????????????????????? //i表示趟數,最多n-1趟
??flag = 0;
??for(j = 1;j < n-i;j++){????? //表示每趟比較次數n-i-1
???comp_num++;
???if(R[j] < R[j-1]){???????? //發生逆序
????temp = R[j];
????R[j] = R[j-1];
????R[j-1] = temp;??? //交換
????move_num += 3;
????flag = 1; //標記發生了交換
???}
??}
??if(flag == 0) break;
?}
}
//快速排序
void quicksort(ElemType R[],int left,int right,int &comp_num,int &move_num)???????? //快速排序
{
?int i = left,j = right;
?ElemType temp = R[i];
?while(i<j){
??while((R[j]>temp)&&(i<j))
??{
???j--;
???comp_num++;
??}
??comp_num++;
??if(i < j){
???R[i++] = R[j];
???move_num++;
??}
??while((R[i] < temp)&&(i<j)){
???i++;
???comp_num++;
??}
??if(i<j){
???R[j--] = R[i];
???move_num++;
??}
?}
?//一次劃分得到基準值的正確位置
?R[i] = temp;
?move_num++;
?if(left < i-1)
??quicksort(R,left,i-1,comp_num,move_num);???????????? //遞歸調用左子區間
?if(i+1 < right)
??quicksort(R,i+1,right,comp_num,move_num);???????????? //遞歸調用右子區間
}
//歸并排序
void merge(ElemType R[],ElemType A[],int s,int m,int t,int &comp_num,int &move_num)
?//對兩個子區間R[s]~R[m]和R[m+1]~R[t]合并,結果存入A中
{
?int i,j,k;
?i = s;j = m+1;k = s;
?while((i<=m)&&(j<=t))
?{
??comp_num++;
??if(R[i] <= R[j]){
???A[k] = R[i];i++;k++;
???move_num++;
??}else{
???A[k] = R[j];j++;k++;
???move_num++;
??}
?}
?while(i <= m){????????????????? //復制第一個區間中剩下的元素
??A[k] = R[i];i++;k++;
??move_num++;
?}
?while(j <= t){????????? //復制第二個區間中剩下的元素
??A[k] = R[j];j++;k++;
??move_num++;
?}
}
//希爾排序
void ShellSort(ElemType R[],int n,int &comp_num,int &move_num)
{
?int i,j,d,k;
?ElemType temp;
?d=n/2;?? //d取初值n/2
?while (d>0)
?{
??comp_num++;
??for (i=d;i<n;i++)
??{
???j=i-d;
???while(j>=0&&R[j]>R[j+d])
???{
????temp=R[j];
????R[j]=R[j+d];
????R[j+d]=temp;
????j=j-d;
????move_num++;
???}?
??}
??printf("??? d=%d:?? ",d);//輸出每一趟排序的結果
??for (k=0;k<n;k++)
??{
???printf("%3d",R[k]);
??}
??printf("\n");
??d=d/2;???????????? //遞減增量d
???? }
}
void mergepass(ElemType R[],ElemType A[],int n,int c,int &comp_num,int &move_num)
?//對R數組做一趟歸并,結果存入A數組中,n為元素個數,c為區間長度
{
?int i,j;
?i = 0;
?while(i+2*c-1 <= n-1){????????? //長度均為c的兩個區間合并成一個區間
??merge(R,A,i,i+c-1,i+2*c-1,comp_num,move_num);
??i += 2*c;
?}
?if(i+c-1 < n)?? //長度不等的兩個區間合并成一個區間
??merge(R,A,i,i+c-1,n-1,comp_num,move_num);
?else{
??for(j = i;j <= n-1;j++)???????? //僅剩一個區間時,直接復制到A中
??{
???A[j] = R[j];
???move_num++;
??}
?}
}
?
void mergesort(ElemType R[],int n,int &comp_num,int &move_num)
{
?int c = 1;
?ElemType A[ITEMNUM];
?while(c < n){
??mergepass(R,A,n,c,comp_num,move_num);? //一次合并,結果存入A中
??c*=2;? //區間長度擴大一倍
??mergepass(A,R,n,c,comp_num,move_num);?? //再次合并,結果存入R中
??c*=2;
?}
}
?
void print(ElemType R[],int n)
{
?for(int i = 0;i <= n-1;i++){
??if(i%10 == 0){
???printf("\n");
??}
??printf("%6d",R[i]);
?}
?printf("\n");
}
?
?
void producerandom(ElemType T[ITEMNUM])
{
?time_t t;
?srand(time(&t));?? //time()返回從某點開始到現在的秒數,返回值與t的值一樣
?for(int i=0;i <= ITEMNUM;i++)
??T[i] =rand()%1000;???????????????? //產生的隨機數
?print(T,ITEMNUM);????????????????????? //輸出隨機數
}
//折半查找
int BinSearch(ElemType R[],ElemType k)??
{
?int low = 0,high =ITEMNUM-1,mid;
?while(low <= high){
??mid =(low + high)/2;
??if(R[mid] == k)????? //查找成功返回
???return mid;
??if(R[mid] > k)? //繼續在R[low..mid-1]中查找
???high = mid-1;
??else
???low = mid+1;? //繼續在R[mid+1..high]中找
?}
?return -1;
}
void clear()????? //自動清屏
{
?system("pause");
?system("cls");
}
void showmenu()
{
?printf("\n\n");
?printf("??????????? ------排序與查找------??????????? \n");
?printf("**********************************************\n");
?printf("*?????????? 1------ 產生隨機數?????????????? *\n");
?printf("*?????????? 2------冒泡排序????????????????? *\n");
?printf("*?????????? 3------快速排序????????????????? *\n");
?printf("*?????????? 4------歸并排序????????????????? *\n");
?printf("*?????????? 5------希爾排序????????????????? *\n");
?printf("*?????????? 6------查找????????????????????? *\n");
?printf("*??????????????????????????????????????????? *\n");
?printf("*?????????? 0------退出????????????????????? *\n");
?printf("**********************************************\n");
?printf("請選擇菜單號(0--6):");
}
void Sort_Search()
{
?ElemType R[ITEMNUM],T[ITEMNUM];
?int comp_num,move_num;??????????? //比較和移動次數
?int i;
?char choice = 'N';
?int randfl = 0;?? //隨機數產生標志,0無,1有
?int sorted = 0;????? //已排序標志
?while(choice != '0'){
??showmenu();
??flushall();
??scanf("%c",&choice);
??switch(choice){
??case '1':
???printf("\n\t產生隨機數.......\n");
???producerandom(T);
???randfl = 1;? //隨機數已產生
???sorted = 0;?? //未排序
???//clear();
???break;
??case '2':
???if(randfl == 0){
????printf("\n\t請產生隨機數\n");
???}else{
????printf("\n\t冒泡排序\n");
????comp_num = 0; move_num = 0;
????for(i = 0;i < ITEMNUM;i++) R[i] = T[i];
????Bubblesort(R,ITEMNUM,comp_num,move_num);
????print(R,ITEMNUM);
????printf("\t 數據比較次數:%d\t,數據移動次數:%d\t\n",comp_num,move_num);
????sorted = 1;???????????????????????????? //已排序
???}
???//clear();
???break;
??case '3':
???if(randfl == 0){
????printf("\n\t? 請先產生隨機數\n");
???}else{
????printf("\n\t快速排序\n");
????comp_num = 0;move_num = 0;
????for(i = 0;i < ITEMNUM;i++) R[i] = T[i];
????quicksort(R,0,ITEMNUM-1,comp_num,move_num);
????print(R,ITEMNUM);
????printf("\t數據比較次數為:%d\t,數據移動次數為:%d\n",comp_num,move_num);
????sorted = 1;
???}
???//clear();
???break;
??case '4':
???if(randfl == 0){
????printf("\n\t請產生隨機數\n");
???}else{
????printf("\n\t歸并排序\n");
????comp_num = 0;move_num = 0;
????for(i = 0;i < ITEMNUM;i++) R[i] = T[i];
????mergesort(R,ITEMNUM,comp_num,move_num);
????print(R,ITEMNUM);
????printf("\t數據比較次數為:%d\t,數據移動次數為:%d\n",comp_num,move_num);
????sorted = 1;
???}
???//clear();
???break;
??case'5':
???if(randfl == 0)
???{
????printf("\n\t請產生隨機數\n");
???}
???else
???{
????printf("\n\t希爾排序\n");
????comp_num = 0;move_num = 0;
????for(i = 0;i < ITEMNUM;i++) R[i] = T[i];
????mergesort(R,ITEMNUM,comp_num,move_num);
????print(R,ITEMNUM);
????printf("\t數據比較次數為:%d\t,數據移動次數為:%d\n",comp_num,move_num);
????sorted=1;
???}
???break;
??case '6':
???if(sorted == 0){
????printf("\n\t隨機數還沒排序呢!\n");
???}else{
????printf("\n\t折半查找\n");
????printf("\n\t請輸入要查找的元素:");
????ElemType key;
????int sit;
????scanf("%d",&key);
????sit = BinSearch(R,key);
????if(sit != -1){
?????printf("\t\t找到該元素,它的位序是:%d\n",sit+1);
????}else{
?????printf("\t\t查找失敗\n");
????}
???}
???//clear();
???break;
??
??case '0':
???printf("\n\t程序結束!\n");
???break;
??default:
???printf("\n\t輸入錯誤,請重新輸入!\n");
??}
??if(choice != '0'){
???flushall();
???//printf("\t\t 按回車鍵繼續......\n");
???clear();
???scanf("%c",&choice);
??}
?}
}
int main()
{
?Sort_Search();
?return 0;
}
?
?
轉載于:https://www.cnblogs.com/java20130723/archive/2012/06/17/3211533.html
總結
以上是生活随笔為你收集整理的数据结构 排序和查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么来用urlrewrite伪静
- 下一篇: Form学习入门系列(一)