数据结构排序算法(代码实现)

一.插入排序法

1.直接插入法排序,C语言实现。

算法思想:略

int main() {
          int  A[]={1,9,4,6,8,10,7};
          int i,j,la;
          la =sizeof(A)/sizeof(A[0]);
          for(i=1;i<la;i++){          //从数组下标为1的开始,也即从第二个元素开始,因为初始假设A[0]为有序的子序列
                    int temp=A[i];  //保存插入元素的临时变量
                    for(j=i-1;j>=0&&A[j]>temp;j--){ //将要插入的第i个元素与第j个元素比较(即与上一个元素比较大小)
                                                                //第i个元素比第j个元素小,则进入循环(即查找插入位置)。(默认是递增序列排序)
                              A[j+1]=A[j];//将第j个元素至i-1个元素依次后移动一个位置(即将较大的元素后移一个位置)
                    }
                    A[j+1]=temp;//将要插入的元素插入j+1的位置(j+1就是需要找的插入位置)。
          }
          for(int a = 0; a<la;a++){
                    printf("%d,",A[a]);
          }
          return 0;
}

2.折半插入排序法,C语言实现

算法思想:略

int main() {
          int  A[]={15,9,4,6,8,10,11};
          int i,j,la,low,high,mid;
          la =sizeof(A)/sizeof(A[0]);
          for(i=1;i<la;i++){
                    int temp=A[i];  //保存插入元素的临时变量
                    low=0; high=i-1; // 确定折半查找范围
                    while(low<=high){ // 递增有序查找
                              mid=(low+high)/2; // 寻找中间元素,向下取整
                              if(A[mid]>temp){
                                        high=mid-1;//中间位置的元素大于第i个位置的元素,则high=mid-1即
                                        //第i个元素会将插入到high+1的位置。
                              }else{
                                        low=mid+1;//否则移动low后,再此进入while循环。
                              }
                    }
                    for(j=i-1;j>=high+1;j--){//上面确定好位置后,现在移动元素位置,从第high+1个元素到i-1个元素依次序
                              //往后移动i一位
                              A[j+1]=A[j];
                    }
                    A[high+1]=temp;//最后将第i个元素存储的临时变量值赋予给第high+1个位置,即插入元素
          }
          for(int a = 0; a<la;a++){
                    printf("%d,",A[a]);
          }
          return 0;
}

3.希尔排序

二.交换排序

1.冒泡排序

int main() {
          int  A[]={10,23,20,2,1};
          int i,j,la,temp;
          la =sizeof(A)/sizeof(A[0]);   //获取数组长度
          for(i=0;i<la;i++){            //排序次数为数组长度-1
                    int flag=0;         //排序结束标志位
                    for(j=la-1;j>i;j--){  //每次排序的比较次数为:数组la-1,循环逐渐递减
                              if(A[j-1]>A[j]){ //满足条件交换(递增排序)
                                        temp=A[j-1];
                                        A[j-1]=A[j];
                                        A[j]=temp;
                                        flag=1; //交换完成后标志位置1
                              }
                    }
                    if(flag==0){ //若标志位为零,则上一次没有发生交换,说明有序,打印出排序结果,结束排序。
                    printf("第%d趟排序结果:",i+1);
                    for(int a = 0; a<la;a++){
                              printf("%d,",A[a]);
                    }
                    printf("\n");
                              return 0; //结束排序
                    }
          }
}

2.快速排序

三.选择排序

1.简单选择排序

int main() {
          int  A[]={10,23,20,2,1};
          int i,j,la,min,temp;
          la =sizeof(A)/sizeof(A[0]);
          for(i=0;i<la;i++){
                    min=i;
                    for(j=i+1;j<la;j++){
                              if(A[j]<A[min]){
                                        min=j;
                              }
                    }
                    if(min!=i){
                              temp=A[i];
                              A[i]=A[min];
                              A[min]=temp;
                    }
                    printf("第%d趟排序结果:",i+1);
                    for(int a = 0; a<la;a++){
                              printf("%d,",A[a]);
                    }
                    printf("\n");
          }
}

2.堆排序

猜你喜欢

转载自www.cnblogs.com/hero-xu/p/11537144.html