几种排序算法

2021-04-01 03:27

阅读:680

标签:插入   namespace   div   name   using   nbsp   一段   main   quic   

  1 /*
  2     线性表的排序算法
  3     cza
  4     2020/7/1
  5 */
  6 #include  7 #include  8 int num[100];
  9 using namespace std;
 10 
 11 int getMix(int left,int right){//找到left到right这一段数据中的最小值
 12     int mixn=left;
 13     for(int i=left;i){
 14         if(num[i]num[mixn]){
 15             mixn=i;
 16         }
 17     }
 18     return mixn;
 19 }
 20 
 21 void select_sort(int left,int right){//选择排序
 22     int flag=getMix(left,right);
 23     int temp=num[flag];
 24     num[flag]=num[left];
 25     num[left]=temp;
 26     left+=1;
 27     if(left==right)
 28         return;
 29     else
 30         select_sort(left,right);//不是循环,从递归调用出来就return
 31     //return;
 32 }
 33 
 34 void bubble_sort(int left,int right){
 35     int temp;
 36     for(int i=left;i1;i++){//这里应该是right-1,如果是right的话i+1会发生“越界”
 37         if(num[i]>num[i+1])
 38         {
 39             temp=num[i];
 40             num[i]=num[i+1];
 41             num[i+1]=temp;
 42         }
 43     }
 44     right-=1;
 45     if(left==right)
 46         return;
 47     else
 48         bubble_sort(left,right);
 49 }
 50 
 51 void insert_sort(int left,int ordered,int right){//插入排序,
 52     int in_place;
 53     for(in_place=left;num[in_place]1];in_place++);
 54     int temp=num[ordered+1];
 55     for(int i=ordered+1;i>in_place;i--){
 56         num[i]=num[i-1];
 57     }
 58     num[in_place]=temp;
 59     ordered+=1;
 60     if(ordered==right-1)//左闭右开时是right-1,闭区间时是right
 61         return;
 62     else
 63         insert_sort(left,ordered,right);
 64 }
 65 void shell_sort(int left,int right){
 66     int i,j,k,temp,gap;
 67     int len=right-left;//左闭右开不用加一
 68     for(gap=len/2;gap>0;gap/=2){//初始步长为数组长度的一半,每次遍历后步长减小为原来的一半
 69           for(i=left;i//变量i为每次分组的第一个元素的下标
 70                 for(j=i+gap;jgap){
 71                     temp=num[j];
 72                     k=j-gap;
 73                     while(k>=left&&num[k]>temp){//向前找,直接插入排序
 74                         num[k+gap]=num[k];
 75                         k-=gap;
 76                     }
 77                     num[k+gap]=temp;
 78                 }
 79 
 80           }
 81     }
 82 }
 83 int getMin(int a,int b){
 84     if(areturn a;
 85     else return b;
 86 }
 87 void merge_sort(int left,int right){//归并排序
 88     if((right-left)>2){
 89         merge_sort(left,(left+right)/2);
 90         merge_sort((left+right)/2,right);
 91     }
 92     int right_pointer=(left+right)/2;
 93     int left_pointer=left;
 94     int temp[100];
 95     int i=left;
 96     while(left_pointer2&&right_pointerright){
 97         int m=getMin(num[left_pointer],num[right_pointer]);
 98         temp[i]=m;
 99         if(num[right_pointer]==m) right_pointer+=1;
100         else left_pointer+=1;
101         i+=1;
102     }
103     if(!(right_pointerright)){
104         while(iright){
105             temp[i]=num[left_pointer];
106             i+=1;
107             left_pointer+=1;
108         }
109     }else{
110         while(iright){
111             temp[i]=num[right_pointer];
112             i+=1;
113             right_pointer+=1;
114         }
115     }
116     for(int j=left;j){
117         num[j]=temp[j];
118     }
119 }
120 
121 void quick_sort(int left,int right){//快速排序
122     if(right-left1) return;
123     int pointer=left;
124     for(int i=left+1;i){
125         if(num[i]num[pointer]){
126             int temp=num[i];
127             for(int j=i;j>pointer;j--){
128                 num[j]=num[j-1];
129             }
130             num[pointer]=temp;
131             pointer+=1;
132         }
133     }
134     quick_sort(left,pointer+1);
135     quick_sort(pointer+1,right);
136 }
137 int main()
138 {
139     int n;
140     cin>>n;
141     for(int i=0;i){
142         cin>>num[i];
143     }
144     //select_sort(0,n);
145     //bubble_sort(0,n);
146     //insert_sort(0,0,n);
147     //shell_sort(0,n);
148     //merge_sort(0,n);
149     quick_sort(0,n);
150     for(int i=0;i){
151         cout" ";
152     }
153 }

 

几种排序算法

标签:插入   namespace   div   name   using   nbsp   一段   main   quic   

原文地址:https://www.cnblogs.com/za-chen/p/13545329.html


评论


亲,登录后才可以留言!