天天看点

一些常见的排序的集合

#include <stdio.h>

 #include <stdlib.h>

 #define  MAX   50 /*线性表的最大长度*/

 typedef int ElemType; /*数据元素类型*/

 /*顺序表类型定义*/

 typedef  struct

 {

ElemType  data[MAX];

      int  length;  /*当前表的长度*/

 } SeqList;

 //创建一个最大长度为50的数组,当然是最大,没有让你全部都用完

 SeqList *InitSeqlist(){

     SeqList *head=(SeqList*)malloc(sizeof(SeqList));//定义一个结构体的指针

     head->length=0;//初始化长度为0

     return head;//返回创建好的一个不知道有木有顺序的数组

 }

 //输入元素

 void input(SeqList *L){

     int n;

     printf("Please input n what you want ?\n");

     scanf("%d",&n);

     int i;

     for(i=0;i<n;i++){//依次获得每一个数据元素

         printf("Please input %d number:",i+1);

         scanf("%d",&L->data[i]);

         L->length++;

         printf("\n");

     }

 }

 //打印输出结果

 void output(SeqList *L){

     int i;//计数器

     for(i=0;i<L->length;i++){//依次遍历每一个元素

         printf("%d ",L->data[i]);

     }

     printf("\n");

 }

 //实现插入算法

 void InsertSortSeq(SeqList *L){

     int i,j,temp;//计数器,计数器,临时变量

     for(i=1;i<L->length;i++){

         j=i-1;

         temp=L->data[i];//存储临时的变量

         for(;j>=0&&L->data[j]>temp;j--){

             L->data[j]=L->data[j-1];//向后面移动

         }

         L->data[++j]=temp;//将当前的空空填进去

     }

 }

 //实现希尔排序

 void ShellSort(SeqList *L){

     int i,j,temp,d;//计数器,计数器,临时变量,步长

     for(d=L->length/2;d>0;d=d/2){//首先给出步长

         for(i=d;i<L->length;i++){

             temp=L->data[i];//临时取出数据

             for(j=i-d;j>=0&&temp<L->data[j];j=j-d){

                 L->data[j+d]=L->data[j];//向后移动

             }

             L->data[d+j]=temp;//将临时的变量放回去

         }



     }

 }

 //实现冒泡排序

 void BubbleSort(SeqList *L){

     int i,j,temp;//定义计数器,缓存变量

     for(i=0;i<L->length-1;i++){

         for(j=0;j<L->length-i-1;j++){

             if(L->data[j]>L->data[j+1]){//完成两个元素之间的交换

                 temp=L->data[j];

                 L->data[j]=L->data[j+1];

                 L->data[j+1]=temp;

             }

         }

     }

 }

 //实现快速排序

 void QuickSort(SeqList *L,int low,int high){

     int i=low,j=high,temp=L->data[i];

     if(i<j){

         while(i!=j){//当i=j时退出循环

             while(i<j&&L->data[j]>=temp) j--;

             if(i<j) L->data[i++]=L->data[j];

             while(i<j&&L->data[i]<=temp) i++;

             if(i<j) L->data[j--]=L->data[i];

         }

         L->data[i]=temp;

         QuickSort(L,low,i-1);

         QuickSort(L,i+1,high);

     }

 }

 //实现选择排序

 void SelectSort(SeqList *L){

     int i,j,min,temp;//计数器和最小值下标

     for(i=0;i<L->length-1;i++){

             min=i;//先要有一个对比的

         for(j=i+1;j<L->length;j++){

             if(L->data[j]<L->data[min]){

                     min=j;//记录下最小的

             }

         }

         if(i!=min){//交换最小的

             temp=L->data[min];

             L->data[min]=L->data[i];

             L->data[i]=temp;

         }

     }

 }

 int men(SeqList *head){

     printf("\t\t\t请输入你的选择!!!!!!!!!!!!\n");

     printf("\t\t\t|****************顺序表排序操作***********|\n");

     printf("\t\t\t|                 1. 冒泡排序法           |\n");

     printf("\t\t\t|                 2. 快速排序法           |\n");

     printf("\t\t\t|                 3. 选择排序法           |\n");

     printf("\t\t\t|                 4. 插入排序法           |\n");

     printf("\t\t\t|                 5. 希尔排序             |\n");

     printf("\t\t\t|                 0.退出                  |\n");

     printf("\t\t\t|*****************************************|\n");

     int a;

     scanf("%d",&a);

     switch(a){

         case 1:BubbleSort(head);break;

         case 2:QuickSort(head,0,head->length);break;

         case 3:SelectSort(head);break;

         case 4:InsertSortSeq(head);break;

         case 5:ShellSort(head);break;

         case 0:return -1;

         default :

             printf("请输入正确的编号");

             break;

     }

     printf("排序之后的样子: ");

     output(head);

 }

 int main(){

     SeqList *head=InitSeqlist();//初始化结构体变量

     input(head);

     while(men(head)!=-1);//进行循环

     return 0;

 }