一、理论摘要:
1.编程时要考虑极端情况,保证程序在任况情况下都能正常运行
2.可以参考其他用户公开的源代码提高自己的实力
3.注册一个在线评测的网站
4.算法是运算法则,就是“达到某种目的的步骤”。
5.运算效率和内存使用量是算法选择最重要的标准。
6.时间复杂度是和空间复杂度是时评估的标准。
7.插入排序:只把数列中比当前数据大的,向后移动(与当前值交换位置)。其优势在于能处理相对有序的数据。
8.冒泡排序:两两交换,得到最小的放最前面。然后将次小的放在第二个上。然后依次执行此过程即可排序
9.选择排序:将未排序部分中的最小值与未排序部分中的首元素交换
10.插入排序,冒泡排序和选择排序的比较:
简单冒泡排序法和选择排序法不依赖数据,但插入排序依赖数据,所以插入排序在处理某些数据时具有很高的效率。
11.能时常保证稳定输出的排序算法称为稳定排序算法。
二、实践:
1.
//外汇问题
#include <iostream>
#include <algorithm>
using namespace std;
static const int MAX = 200000;
int main() {
// int R[MAX],n;
// cin >> n;
// for ( int i = 0 ; i < n ; i ++ ) cin >> R[i];
int n = 6;
int R[6] = {5,3,1,3,4,3};
int maxv = -20000000;
int minv = R[0];
for ( int i = 1 ; i < n ; i ++){
maxv = max(maxv,R[i]-minv);
minv = min(minv,R[i]);
cout<<maxv<<" "<<minv<<" "<<i<<":"<<R[i]<<endl;
}
cout << maxv <<endl;
return 0;
}
2.
//插入排序
#include <stdio.h>
void trace(int A[],int N){
int i;
for(i = 0 ; i <N ; i ++){
if ( i > 0 ) printf(" ");
printf("%d",A[i]);
}
printf("\n");
}
void insertionSort(int A[],int N){
int j,i,v;
for ( i = 1; i <N; i ++){
v = A[i];
j = i - 1;
while (j >= 0 && A[j] > v){
A[j+1] = A[j];
j --;
}
A[j+1] = v;
trace(A,N);
}
}
int main(){
int N,i,j;
int A[100];
scanf("%d",&N);
for ( i = 0 ; i < N ; i ++) scanf("%d",&A[i]);
trace(A,N);
insertionSort(A,N);
return 0;
}
3.
//冒泡排序
#include <iostream>
using namespace std;
int bubbleSort(int A[],int N) {
int sw = 0;
bool flag = 1;
for (int i = 0; flag; i++) {
flag = 0;
for (int j = N - 1; j >= i + 1; j--) {
if (A[j] < A[j - 1]) {
swap(A[j], A[j - 1]);
flag = 1;
sw++;
}
}
}
return sw;
}
int main(){
int A[100],N,sw;
cin >> N;
for ( int i = 0 ; i < N ; i ++) cin>>A[i];
sw = bubbleSort(A,N);
for ( int i = 0 ; i < N ; i ++){
if (i) cout<< " ";
cout << A[i];
}
cout << endl;
cout << sw <<endl;
return 0;
}
4.
//选择排序
#include <stdio.h>
int selectionSort(int A[],int N){
int i,j,t,sw = 0 ,minj;
for ( i = 0 ; i < N - 1 ; i ++){
minj = i;
for ( j = i ; j < N ; j ++){
if ( A[j] < A[minj] ) minj = j;
}
t = A[i];A[i] = A[minj];A[minj] = t;
if ( i != minj) sw++;
}
return sw;
}
int main(){
int A[100],N,i,sw;
scanf("%d",&N);
for ( i = 0 ; i <N ; i ++) scanf("%d",&A[i]);
sw = selectionSort(A,N);
for ( i = 0 ; i < N ; i ++){
if ( i > 0 ) printf(" ");
printf("%d",A[i]);
}
printf("\n");
printf("%d\n",sw);
return 0;
}
5.
//判断排序是否稳定
#include <iostream>
using namespace std;
struct Card { char suit,value; };
void bubble(struct Card A[],int N){
for ( int i = 0 ; i < N ; i ++){
for (int j = N -1 ; j >=i+1 ; j --){
if ( A[j].value < A[j-1].value ){
Card t = A[j];A[j] = A[j-1];A[j-1] = t;
}
}
}
}
void selection (struct Card A[],int N){
for (int i = 0 ; i < N ; i ++ ) {
int minj = i ;
for ( int j = i ; j < N ; j ++){
if ( A[j].value < A[minj].value ) minj = j;
}
Card t = A[i];A[i] = A[minj] ; A[minj] = t;
}
}
void print (struct Card A[],int N){
for ( int i = 0 ; i < N ; i ++){
if ( i > 0 ) cout << " ";
cout << A[i].suit << A[i].value;
}
cout << endl;
}
bool isStable(struct Card C1[],struct Card C2[],int N){
for ( int i = 0 ; i < N ; i ++){
if ( C1[i].suit != C2[i].suit ) return false;
}
return true;
}
int main(){
Card C1[100],C2[100];
int N;
char ch;
cin >> N ;
for ( int i = 0 ; i < N ; i ++){
cin >> C1[i].suit >> C1[i].value;
}
for ( int i = 0 ; i < N ; i ++ ) C2[i] = C1[i];
bubble(C1,N);
selection(C2,N);
print(C1,N);
cout << "Stable" << endl;
print(C2,N);
if ( isStable(C1,C2,N)){
cout << "Stable" << endl;
}else {
cout << "Not stable " <<endl;
}
return 0;
}