标签:ace 冒泡 mic 因子 stream 元素 quic 工作 +=
最近大二的dalao给大一宝宝讲了排序算法,发现自己也好久没有看排序了( sort真香 )。
所以来总结一波排序。
大一宝宝们看完选择性的吸收哦~
排序算法 | 平均复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|
冒泡排序 | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(1) | 不稳定 |
插入排序 | O(n2) | O(1) | 稳定 |
希尔排序 | O(n log n) | O(1) | 不稳定 |
归并排序 | O(n log n) | O(n) | 稳定 |
快速排序 | O(n log n) | O(log n) | 不稳定 |
桶排序 | O(n+k) | O(n+k) | 稳定 |
( 自己的实力只允许这几种排序 /肥宅大哭 )
动画演示
参考代码
#include<cstdio>
void BuddleSort(int a[],int n) {
for(int i=0 ; i<n-1 ; i++){
for(int j=0 ; j<n-i-1 ; j++){
if(a[j]>a[j+1]){
int swap=a[j];
a[j]=a[j+1];
a[j+1]=swap;
}
}
}
}
int main(void) {
int a[]={6, 9,8,4,5,2,1,3,7};
int n=sizeof(a)/sizeof(int);
BuddleSort(a,n);
printf("冒泡排序结果:");
for (int i = 0 ; i < n ; i++){
printf("%d ", a[i]);
}
return 0;
}
动画演示
参考代码:
#include<cstdio>
void SelectSort(int a[],int n) {
for(int i=0;i<n-1;i++){
int min=i; //存放数组最小值的位置
for(int j=i+1;j<n;j++){
if(a[j]<a[min]){
min=j; //找出最小值,并记录位置
}
}
if(min!=i) //最小元素与第i个元素互换位置 {
int swap=a[min];
a[min]=a[i];
a[i]=swap;
}
}
}
int main(void) {
int a[]={8,9,7,1,5,4,2,3,6};
int n=sizeof(a)/sizeof(int);
SelectSort(a,n);
printf("选择排序结果:");
for (int i = 0; i < n; i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
算法步骤:
动画演示:
参考代码
#include<cstdio>
void InsertSort(int a[],int n) {
for(int i=0 ; i<n ; i++){
int j=i-1;
if(a[i]<a[i-1]){ //若第i个元素小于第i-1个元素,移动有序序列插入------大于的话则直接插入
int swap=a[i]; //存储将要排序的元素
a[i]=a[i-1]; //向后移动一个元素
while(swap < a[j]) {//查询将要插入的位置
a[j+1]=a[j];
j--; //元素后移
}
a[j+1]=swap;//循环结束 插入到指定位置
}
}
}
int main(void) {
int a[] = { 9,7,8,2,5,1,3,6,4};
int n = sizeof(a)/sizeof(int);
InsertSort(a, n);
printf("排序好的数组为:");
for (int i=0 ; i<n ; i++) {
printf("%d", a[i]);
}
printf("\n");
return 0;
}
动画演示:
参考代码:
#include<iostream>
using namespace std;
void print(int a[], int n){
for(int j= 0; j<n; j++){
cout<<a[j] <<" ";
}
cout<<endl;
}
void shellSort(int a[], int n) {
int i,j,gap; // gap为步长,每次减为原来的一半。
for (gap = n / 2; gap > 0; gap /= 2){
// 共gap个组,对每一组都执行直接插入排序
for (i = 0 ;i < gap; i++){
for (j = i + gap; j < n; j += gap) {
// 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
if (a[j] < a[j - gap]){
int tmp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > tmp){
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = tmp;
}
}
}
}
}
int main(void) {
int a[10] = {8,1,9,7,2,4,5,6,10,3};
shellSort(a,10);
cout<<"排序结果:";
print(a,10);
return 0;
}
动画演示:
参考代码:
#include<iostream>
using namespace std;
void mergearray(int a[],int first,int mid,int last,int t[]) {
int i=first,j=mid+1;
int n=mid,m=last;
int k=0;
while(i<=n && j<=m){
if(a[i]<=a[j]){
t[k++]=a[i++];
}
else{
t[k++]=a[j++];
}
}
while(i<=n)
t[k++]=a[i++];
while(j<=m)
t[k++]=a[j++];
for(i=0;i<k;i++)
a[first+i]=t[i];
}
void mergesort(int a[],int first,int last,int t[]) {
if(first < last){
int mid=(first+last)/2;
mergesort(a,first,mid,t);
mergesort(a,mid+1,last,t);
mergearray(a,first,mid,last,t);
}
}
int MergeSort(int a[],int len) {
int *temp=new int [len];
if(temp==NULL) return 0;
else mergesort(a,0,len-1,temp);
delete []temp;
return 1;
}
int main(void) {
int n;
cin>>n;
int *arr = new int[n];
for(int i=0 ; i<n ; i++){
cin>>arr[i];
}
MergeSort(arr,n);
for(int i=0 ; i<n ; i++){
cout<<arr[i]<<" ";
}
return 0;
}
动画演示:
参考代码:
#include <stdio.h>
#include <string.h>
int a[100 + 1];
void quickSort(int l, int r, int a[]) {
int i = l, j = r; int mid = (i + r) / 2;
do {
while (a[i] < a[mid]) ++i;//循环结束时,a[i] >= a[mid]
while (a[mid] < a[j]) --j;//循环结束时,a[j] <= a[mid]
if (i <= j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp; ++i; --j;//交换数值后继续搜索
}
} while (i <= j);//我们需要结束时i > j
if (l < j) quickSort(l, j, a);
//若未找到两个数的边界,则递归搜索左右区间。l < j则j - l > 0
//即l与j之间还有数字可以继续
if (i < r) quickSort(i, r, a);
}
int main(void) {
int n;
memset(a, 0, sizeof(a));
printf("请输入你要排序多少个数:");
scanf("%d", &n); printf("\n请输入这%d个数字\n", n);
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
}
quickSort(1, n, a);
for (int i = 1; i <= n; ++i) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
动画展示
标签:ace 冒泡 mic 因子 stream 元素 quic 工作 +=
原文地址:https://www.cnblogs.com/LittleBanana/p/11909371.html