常见的排序算法
来源:互联网 发布:win10软件字体模糊 编辑:程序博客网 时间:2024/05/14 13:37
主要实现了一下算法:
1.插入排序
2.冒泡排序
3.快速排序
4.希尔排序
5.堆排序
代码如下:
#include<stdio.h>#include<stdlib.h>void creat(int a[],int n);void show(int a[],int n);void swap(int *a,int *b);void bubbleSort(int a[],int n);void insertSort(int a[],int n);void quickSort(int a[],int low,int high);void qusort(int a[],int l,int r);void selectSort(int a[],int n);void shellSort(int a[],int n);void shellSort3(int a[],int n);//28 13 2 1 8 2 9 18 23 19 //测试数据void CreateMenu();void Sift(int a[],int low,int high); //调整堆void HeapSort(int a[],int n);//堆排序void Reverse(int a[],int n);//对数组进行调整,从1开始存储void ShowHeap(int a[],int n);//输出堆void main(){int a[20];int i=0,select=1;char ch;while(select){system("cls");CreateMenu();scanf("%d",&select);switch(select){case 1:creat(a,10);break;case 2:insertSort(a,10);show(a,10);break;case 3:bubbleSort(a,10);show(a,10);break;case 4:quickSort(a,0,9);//qusort(a,0,9);show(a,10);break;case 5:shellSort(a,10);show(a,10);break;case 6:Reverse(a,10);HeapSort(a,10);ShowHeap(a,10);break;}if(select ==1 ||select ==2||select ==3||select ==4||select ==5|| select ==6){printf("输入回车继续:");scanf("%c%*c",&ch); }}//insertSort(a,10);//bubbleSort(a,10);//quickSort(a,0,9);//qusort(a,0,9);//selectSort(a,10);//shellSort(a,10);//show(a,10);}void CreateMenu(){char *menu[]= {"\t\t\t排序\n","\t\t1.输入要排序的数组:\n","\t\t2.插入排序\n","\t\t3.冒泡排序\n","\t\t4.快速排序\n","\t\t5.希尔排序\n","\t\t6.堆排序\n","\t\t7.请输入(1_6):"};int i;for(i=0;i<8;i++)printf("%s",menu[i]);}void creat(int a[],int n){int i;printf("Please input %d numbers!\n",n);for(i=0;i<n;i++){scanf("%d",&a[i]);}}void show(int a[],int n){int i;printf("after sort the num is :\n");for(i=0;i<n;i++)printf("%4d",a[i]);printf("\n");}void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;}/*插入排序*/void insertSort(int a[],int n){int i,j,temp;for(i=1;i<=n;i++){j=i-1;temp= a[i]; //设置岗哨while(temp<a[j] && j>=0) //找对地方然后后移{a[j+1]= a[j];j--;}a[j+1]=temp;}}/*冒泡排序排n趟,每一趟两两比较*/void bubbleSort(int a[],int n){int i,j;for(i=0;i<n;i++)for(j=0;j<n-i;j++){if(a[j]>a[j+1]){swap(&a[j],&a[j+1]);}}}void quickSort(int a[],int low,int high) //以第一个元素作为比较元素{if(low<high){int i =low , j = high;int key = a[low];//下面完成一趟排序,小于key的放在左边,大于key的放在右边while(i<j){while(i<j&&a[j]>key) //从右往左找到第一个小于key的值j--;if(i<j){a[i] = a[j];i++;}while(i<j&&a[i]<key) //从左向右找到第一个大于key的值i++;if(i<j){a[j]=a[i];j--;}}a[i]= key; //key放在最终的位置quickSort(a, low,i-1);quickSort(a, i+1,high);}}void qusort(int a[],int l,int r) //以中间元素作为比较元素{ int i=l,j=r,mid=a[(l+r)>>1]; //int mid = a[l]; while (i<j) //找出左边大于中间的值,右边小于中间的值,进行交换 { while (a[i]<mid) i++; while (mid<a[j]) j--; if (i<=j) { swap(&a[i],&a[j]); i++; j--; } } if (l<j) qusort(a,l,j); if (i<r) qusort(a,i,r);}//选择排序,每一趟选出最小的和第i个进行交换void selectSort(int a[],int n){int i,j,index;for(i=0;i<n;i++){index=i;for(j=i+1;j<n;j++){if(a[j]<a[index]){index=j; //记录最小的index}}swap(&a[i],&a[index]);}}void shellSort(int a[],int n){int d,i,j;for(d=n/2;d>=1;d/=2) //缩量去一半,整个数组n/2组{for(i=d;i<n;i++) {int e=a[i];for(j=i-d;j>=0&&e<a[j];j-=d) //每组2个数据进行插入查找//a[j+d]=a[j];//a[j+d]=e;swap(&a[j+d],&a[j]);}}}void shellSort3(int a[],int n){int i,j;for(i=5;i>=1;i-=2){for(j=i;j<n;j++){if(a[j-i]>a[j])swap(&a[j-i],&a[i]);}}}void Sift(int a[],int low,int high)//从low到high进行大根调整,数组从1开始存储{int i=low,j=2*i;int temp =a[i];while(j<=high) //向下进行调整{if(j<high && a[j]<a[j+1]) //若右孩子较大,则j指向右孩子j++;if(temp<a[j]) //进行调整{a[i] = a[j];i=j;j=2*i;}elsebreak;}a[i] =temp;//将调整的值放入最终位置}void HeapSort(int a[],int n) //堆排序{int i;int temp;for(i=n/2;i>=1;i--)Sift(a,i,n); //开始建堆for(i=n;i>=2;i--) //将根节点放入最后位置{temp = a[1];a[1] =a[i];a[i] = temp;Sift(a,1,i-1);}}void Reverse(int a[],int n){int i;for(i=n+1;i>0;i--){a[i] = a[i-1];}}void ShowHeap(int a[],int n){int i;for(i=1;i<=n;i++)printf("%4d",a[i]);}
完美测试!
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 注册Microsoft.Jet.OLEDB.4.0
- Span元素的width属性无效果原因及解决方案
- 计算机视觉
- failed: Can’t locate DBD/mysql.pm的解决办法
- android 点9图制作
- 常见的排序算法
- DATAWINDOW技巧
- 二 Linux的基本操作
- OANET(三):建立arm-linux交叉编译环境
- Zoj 3203 Light Bulb
- 程序员接项目
- iphone core data 基础操作
- 数据库常用操作3
- 【VC报错】LeaveCriticalSection中断异常