基础排序 自练

目录

1.优化冒泡 

2.直接插入排序 

3.shell 

4.堆排序 

5.归并排序 (递归版


1.优化冒泡 

#include<stdio.h>
#include<stdlib.h>
#define MAX_size 100
typedef struct{
    int a[MAX_size];
    int length;
}SqLiszt;
void
swap(SqLiszt *L,int i,int j){
    int temp = L->a[i];
    L->a[i]= L->a[j];
    L->a[j]= temp;
}
void 
Bubble_sort(SqLiszt *L){
      int i,j,flag = 1;
       for(i=1;i<L->length && flag ;i++){
           flag = 0;
             for(j=L->length-1;j>=i;j--){ //从后往前 小的在当前j  是下一轮的j+1  
                  if(L->a[j]>L->a[j+1]){
                        swap(L,j,j+1);
                        flag =1;
                  }
             }
       }

}

int main(){
     SqLiszt L;
     L.length =0; //要初始化 为 0!!!!!
     int temp;
        for(int i =1;i<=10;i++){
              scanf("%d",&temp);
              L.a[i] = temp;
              L.length ++;
        }

         Bubble_sort(&L);
        printf("排序后的结果为:\n");
             for(int i= 1; i<=L.length;i++){
                  printf("%d ",L.a[i]);
             }

    return 0;
}

2.直接插入排序 

#include<stdio.h>
#include<stdio.h>
#define MAX_size 100
typedef struct{
    int a[MAX_size];
    int length;
}SqLiszt;
void
swap(SqLiszt *L,int i,int j){
    int temp = L->a[i];
    L->a[i]= L->a[j];
    L->a[j]= temp;
}
void 
Insert_sort(SqLiszt *L){
    int i ,j;
     for(i=2;i<=L->length;i++){ // [0] 做额为空间  【1】 相当于已经排好
            if( L->a[i-1]>L->a[i] ){
                  L->a[0] = L->a[i];
                   for(j=i-1; L->a[j]>L->a[0] ;j--){//如果大于插入的 向后移一位
                          L->a[j+1]=L->a[j];
                   }
                      L->a[j+1]= L->a[0];   //最后j-- 定位到比插入的值小的位置 
            }
          
     }
}
int main(){
     SqLiszt L;
     L.length =0; //要初始化 为 0!!!!!
     int temp;
        for(int i =1;i<=10;i++){
              scanf("%d",&temp);
              L.a[i] = temp;
              L.length ++;
        }

        Insert_sort(&L);
        printf("排序后的结果为:\n");
             for(int i= 1; i<=L.length;i++){
                  printf("%d ",L.a[i]);
             }

    return 0;
}

3.shell 

#include<stdio.h>
#include<stdio.h>
#define MAX_size 100
typedef struct{
    int a[MAX_size];
    int length;
}SqLiszt;
void 
Shell_sort(SqLiszt *L){
    int increment = L->length;
    int j,i;
      do{
           increment /=2;//初始分为五组, 增量越小 一组内元素越多
            for( i= increment+1; i<=L->length; i++){ //排一次 基本有序 
                  if( L->a[i]<L->a[i-increment] ){ // 将 a【i】 插入到自己的增量组中
                       L->a[0]= L->a[i];
                        for(j=i-increment;j>0 &&  L->a[j] > L->a[0] ;j-=increment){
                                 L->a[j+increment]= L->a[j]; //初始 j 就是上一个位置 ,所以要加步长才是原本要插入的位置  --》 增量组整体后移
                        }
                           L->a[j+increment]= L->a[0];
                  }
            }
      } while(increment >1 ); //增量为 1 才结束 表示分为一个组
}
int main(){
     SqLiszt L;
     L.length =0; //要初始化 为 0!!!!!
     int temp;
        for(int i =1;i<=10;i++){
              scanf("%d",&temp);
              L.a[i] = temp;
              L.length ++;
        }

        Shell_sort(&L);
        printf("排序后的结果为:\n");
             for(int i= 1; i<=L.length;i++){
                  printf("%d ",L.a[i]);
             }

    return 0;
}

4.堆排序 

#include<stdio.h>
#include<stdio.h>
#define MAX_size 100
typedef struct{
    int a[MAX_size];
    int length;
}SqLiszt;
void Heap_max(SqLiszt *L,int s,int max);
void
swap(SqLiszt *L,int i,int j){
    int temp = L->a[i];
    L->a[i]= L->a[j];
    L->a[j]= temp;
}
void 
Heap_sort(SqLiszt *L){
    for(int i = L->length/2;i>=1;i--){
         Heap_max(L,i,L->length);   //将每个非叶子子树排序为大顶堆 -》从下到上
    }
      for(int i = L->length ; i>1;i--){
          swap(L,1,i);   //将跟(最大的元素) 换为尾部 
          Heap_max(L,1,i-1); // 排除已挑选最大的元素 重新变长大顶堆 循环 
      }

}
void 
Heap_max(SqLiszt *L,int s,int max){   // s - max  构成大顶堆 
        L->a[0] =  L->a[s];
          int i;
          for( i = s*2;i<= max;i*=2){ //*2 为左子树 
             if( i<max &&L->a[i] < L->a[i+1])
                      i++; //定位到大的 子树(右子树  如果有
                if(L->a[0] >= L->a[i])
                      break;
                      //能执行到这 说明子元素大于跟 互换 
                  L->a[s]= L->a[i];  
                        s = i; // 往子树走 
          }
            L->a[s]= L->a[0]; // 找到自己位置 
         
}
int main(){
     SqLiszt L;
     L.length =0; //要初始化 为 0!!!!!
     int temp;
        for(int i =1;i<=10;i++){
              scanf("%d",&temp);
              L.a[i] = temp;
              L.length ++;
        }

       Heap_sort(&L);
        printf("排序后的结果为:\n");
             for(int i= 1; i<=L.length;i++){
                  printf("%d ",L.a[i]);
             }

    return 0;
}

5.归并排序 (递归版

#include<stdio.h>
#include<stdlib.h>
#define MAX_size 100
typedef struct{
    int a[MAX_size];
    int length;
}SqLiszt;
void Merge(int *sr,int *tr,int i,int m,int n){  //m为中间数  归并到tr  sr  1-m
          int p1 =i,p2=m+1,temp = i;
            while(p1<=m&& p2<=n){
                  if(sr[p1]<sr[p2])
                      tr[temp++]= sr[p1++];
                        else 
                          tr[temp++]= sr[p2++];

            }
              while(p1<=m){
                     tr[temp++]= sr[p1++];
              }
              
              while(p2<=n){
                    tr[temp++]= sr[p2++];

              }
             
}
void M_Sort(int *sr, int *tr1,int s,int t){ //s 为第一个 ,t 为最后一个 
         int mid;
          int tr2[MAX_size]; 
           if(s==t){
                tr1[s]= sr[s];
           }
               else{
                    mid = (s+t)/2;
                       M_Sort(sr,tr2,s,mid);  
                       M_Sort(sr,tr2,mid+1,t);
                       Merge(tr2,tr1,s,mid,t);
                }
                 
}
void 
Merge_sort(SqLiszt *L){
        M_Sort(L->a,L->a,1,L->length);
}
int main(){
     SqLiszt L;
     L.length =0;
     int temp;
        for(int i =1;i<=10;i++){
              temp = 10-i;
              L.a[i] = temp;
              L.length ++;
        }

       Merge_sort(&L);
        printf("排序后的结果为:\n");
             for(int i= 1; i<=L.length;i++){
                  printf("%d ",L.a[i]);
             }

    return 0;
}
#include<stdio.h>
#define MAX_size 100
typedef struct{
    int a[MAX_size];
    int length;
}SqLiszt;
void
swap(SqLiszt *L,int i,int j){
    int temp = L->a[i];
    L->a[i]= L->a[j];
    L->a[j]= temp;
}
int 
Partition(SqLiszt *L,int low,int high){
     //改进1 三值取中间 
    int mid = (low+high)/2;
    if(L->a[low]>L->a[high])
       swap(L,low,high);
    if(L->a[mid]>L->a[high])
       swap(L,mid,high);
    if(L->a[low]> L->a[mid])
       swap(L,low,mid);
//---------
   int pivot = L->a[low];
   L->a[0]=pivot; //改进2 不用交换,存储 替代 
   while(low<high){
      while(low<high&& pivot <= L->a[high]){  // 找到一个小于初始值的换到左边
                      high--;
      }
            L->a[low]= L->a[high];
      
      while(low<high && pivot >= L->a[low]){
            low++;             //找到一个大于初始值的换到右边
      }
           L->a[high]= L->a[low];
   }
   L->a[low] = L->a[0]; //储存的值填入
   return low;

     
}   

void 
Qsort(SqLiszt *L,int low ,int high){
    int pivot;
      while(low<high){ //改进3  尾部递归可以换成迭代!
           pivot = Partition(L,low,high); 
             Qsort(L,low,pivot-1);
             low = pivot +1;  //再进while循环 pivot 相当于 Qsort  
      }
}
void 
Quick_sort(SqLiszt *L){
   Qsort(L,1,L->length);
}
int main(){
     SqLiszt L;
     L.length =0;
     int temp;
        for(int i =1;i<=10;i++){
              scanf("%d",&temp);
              L.a[i] = temp;
              L.length ++;
        }

       Quick_sort(&L);
        printf("排序后的结果为:\n");
             for(int i= 1; i<=L.length;i++){
                  printf("%d ",L.a[i]);
             }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值