常见的排序算法

来源:互联网 发布: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]);}

完美测试!

原创粉丝点击