标签:插入 namespace div name using nbsp 一段 main quic
1 /* 2 线性表的排序算法 3 cza 4 2020/7/1 5 */ 6 #include<iostream> 7 #include<stdio.h> 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<right;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;i<right-1;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]<num[ordered+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<gap;i++){//变量i为每次分组的第一个元素的下标 70 for(j=i+gap;j<len;j+=gap){ 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(a<=b) return 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_pointer<(left+right)/2&&right_pointer<right){ 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_pointer<right)){ 104 while(i<=right){ 105 temp[i]=num[left_pointer]; 106 i+=1; 107 left_pointer+=1; 108 } 109 }else{ 110 while(i<=right){ 111 temp[i]=num[right_pointer]; 112 i+=1; 113 right_pointer+=1; 114 } 115 } 116 for(int j=left;j<right;j++){ 117 num[j]=temp[j]; 118 } 119 } 120 121 void quick_sort(int left,int right){//快速排序 122 if(right-left<=1) return; 123 int pointer=left; 124 for(int i=left+1;i<right;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<n;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<n;i++){ 151 cout<<num[i]<<" "; 152 } 153 }
标签:插入 namespace div name using nbsp 一段 main quic
原文地址:https://www.cnblogs.com/za-chen/p/13545329.html