数据排序
数据排序
1.选择排序
思想:每次从待排序的数列中选取最小的数,放在序列的最前面。
例如 :1 [49 38 65 97 78 13 27 49]
2 13 [38 65 97 76 49 27 49]
3 13 27 [65 97 76 49 38 49]
...............................................
7 13 27 38 49 49 65 76 97
上代码
#include<iostream> #include<cstdio> using namespace std; int main() { double a[1000],n; cin>>n; //输入n个数 for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<n;i++) //将n个数排好序需要执行(n-1)次 { int k=i; //记录排序次数,第i次确定第i小的数 for(int j=i+1;j<=n;j++) //先假设在剩下的序列中第k个是最小的 if(a[j]<a[k]) //遇到比第k个数小的数,则记录下它的位 //置 k=j; if(k!=i) swap(a[k],a[i]); //交换a[k]和a[i] } for(int i=1;i<=n;i++) cout<<a[i]<<" "; //输出 return 0; //完美收场 }
2:冒泡排序
思想:每一次通过比较相邻的两个数据,若是逆序对(从大到小),则交换他们。
每一次排序选出最大的数放在待排序数列的最后面。
例如:1.[17 15 36 98 14 21]
2.[15 17 36 98 14 21]
3.[15 17 36 98 14 21]
4.[15 17 36 98 14 21]
5.[15 17 36 14 98 21]
6.[15 17 36 14 21] 98
通过一次冒泡,将最大的数排在了最后。
上代码
#include<iostream> #include<cstdio> using namespace std; int main() { double a[1000]; int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n-1;i++) //i控制次数,排好n个数据,共需要冒泡(n-1)次 for(int j=1;j<=n-i;j++) //相邻两个数据比较 if(a[j]>a[j+1]) //若为逆序对 swap(a[j],a[j+1]); //交换 for(int i=1;i<=n;i++) cout<<a[i]<<" "; //输出 return 0; }
3.桶排序
思想:将数据放在对应下标的桶中,按照顺序依次输出。 以空间换时间
例如:[1 0 6 5 3 1 7 8]
桶 0 1 2 3 4 5 6 7 8
数量 1 2 0 1 0 1 1 1 1
输出 0 1 1 3 5 6 7 8
上代码
#include<iostream> #include<cstdio> using namespace std; int a[10000],b[10000000]; int main() { int n,m,i=1; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { m=a[i]; //将数据放在对应下标的桶里 b[m]++; } while(i<10000) //在数据范围内检查 { if(b[i]!=0) //若发现不是空桶 { b[i]--; //桶内数量-1 cout<<i<<" "; //输出 } else i++; //若为空桶,检查下一个,如果要求相同数据只输出一次,可以去掉else } return 0; }
4.sort排序 个人感觉是最好用的一个
C++中自带的函数,结构为sort(a,a+n,排序函数) 排序函数可以省略,默认为从小到大排序
注:若使用sort排序,需先声明include<algorithm>
上代码
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[10000]; bool cmp(int x,int y) { return x<y; //从小到大排序,若想从大到小,可以改为x<y } int main() { int n; cin>>n; for(int i=0;i<=n-1;i++) cin>>a[i]; sort(a,a+n,cmp); for(int i=0;i<=n-1;i++) cout<<a[i]<<" "; return 0; }
2021-02-04
5.快速排序
快速排序是对冒泡排序的优化,运用了二分的思想,但是不稳定,相同的元素可能会改变顺序,但一般影响不是很大。听这就知道这种方法速度很快,时间复杂度On(logn)
看代码
1 #include<iostream> 2 using namespace std; 3 int a[100000000]; 4 void f(int l,int r) 5 { 6 int i,j,mid,p; 7 i=l;j=r; 8 mid=(l+r)/2; 9 do{ 10 while(a[i]<mid) i++; 11 while(a[j]>mid) j--; 12 if(i<=j) 13 { 14 p=a[i];a[i]=a[j];a[j]=p; 15 i++;j--; 16 } 17 }while(i<=j); 18 if(l<j) f(l,j); 19 if(i<r) f(i,r); 20 } 21 int main() 22 { 23 int n,i; 24 cin>>n; 25 for(i=1;i<=n;i++) 26 cin>>a[i]; 27 f(1,n); 28 for(i=1;i<=n;i++) 29 cout<<a[i]<<" "; 30 return 0; 31 }
6.归并排序
#include<iostream> #include<cstdio> using namespace std; #define de define long long ans; int a[1000000],c[1000000]; void msort(int b,int e) { if(b==e) return ; int mid=(b+e)/2,i=b,j=mid+1,k=b; msort(b,mid); msort(mid+1,e); while(i<=mid&&j<=e) { if(a[i]<=a[j]) c[k++]=a[i++]; else c[k++]=a[j++],ans+=(mid-i+1) ; } while(i<=mid) c[k++]=a[i++]; while(j<=e) c[k++]=a[j++]; for(int i=b;i<=e;i++) a[i]=c[i]; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; msort(1,n); cout<<ans; }
2021年4月12日11:04:59 加入归并排序,完结