省流:排序为n^2得3种方法 一,站队 1,选择排序 找最大或最小,用k记录当前最小数的位置,将最小数和第一个数对调,n个数经过n-1次选择; for(int i=1;i<=n;i++) { k=i; for(int j=i+1;j<=n;j++) { if(a[j]<a[k]) k=j; if(k!=i) { temp=a[i; a[i]=a[k]; a[k]=temp; } } for(int i=1;i<=n;++i) pfintf("%d",a[i]); return 0; } 缺点:n 大时效率过低 2,冒泡排序 将前n个数中的最大数调到n-1处 for(i = 1; i <= n; i++) cin >> h[i]; for(i = 1; i < n; i++) for(j = 1; j <= n-i; j++) if(h[j] > h[j+1]){ temp = h[j]; h[j] = h[j+1]; h[j+1] = temp; } for(i = 1; i < n; i++) cout << h[i] << “ “ ; cout << h[n] << endl; return 0; } 缺点:同上,较少代码但效率更低,存在并列情况时更稳定 优化冒号排序 int n,i,j,temp,h[101]; cin >> n; for(i = 1; i <= n; i++) cin >> h[i]; for(i = 1; i < n; i++){ bool flag = true; for(j = 1; j <= n-i; j++) if(h[j] > h[j+1]){ temp = h[j]; h[j] = h[j+1]; h[j+1] = temp; flag = false; } if(flag) break; } for(i = 1; i < n; i++) cout << h[i] << “ “ ; cout << h[n] << endl; return 0; } 缺点:全为倒序时并未优化 3,插入排序 将排序分为前后2段,每趟将后一段第一个数插入中间 int n,i,j,k,temp,h[101]; cin >> n; for(i = 1; i <= n; i++) cin >> h[i]; for(i = 2; i <= n; i++){ temp = h[i]; k = 1; while(h[k] <= temp && k < i) k++; for(j = i-1; j >= k; j--) h[j+1] = h[j]; h[k] = temp; } for(i = 1; i < n; i++) cout << h[i] << “ “ ; cout << h[n] << endl; return 0; } 缺点:同上,常量级的优化,没有太大优势。

0 条评论

目前还没有评论...