(1)冒泡排序
#include<iostream>
using namespace std;
int main() {
//利用冒泡排序实现升序排列,排序的次数为元素数-1
//每轮对比次数:元素个数-排序轮数-1;
int A[6]= {4,3,1,5,3},i;
for(i=0; i<6; i++) {
cout<<A[i]<<" ";
}
cout<<endl;
//开始冒泡排序
//总共排序轮数为6-1
for(int i=0; i<6-1; i++) {
//内层循环对比 次数=元素个数-排序轮数-1
for(int j=i; j<6-i-1; j++) {
if(A[j]>A[j+1])
swap(A[j],A[j+1]);
}
}
for(int i=0;i<6;i++)
{cout<<A[i]<<" ";
}
return 0;
}
(2)归并排序
#include<iostream>
#include<algorithm>
using namespace std;
//归并排序
void mergesort(int *A, int *temp, int left, int right) {
if(left>=right)return;
int mid=(left+right)/2;//找到中间位置
mergesort(A,temp,left,mid);//递归处理前半部分
mergesort(A,temp,mid+1,right);//递归处理后半部分
for(int i=left; i<=right; i++)
temp[i]=A[i];//将A中元素赋值给temp数组中
int i1=left;
int i2=mid+1;
for(int curr=left; curr<=right; curr++) {
if(i1==mid+1)
A[curr]=temp[i2++];
else if(i2>right)//如果超过数组总元素
A[curr]=temp[i1++];
else if(temp[i1]<temp[i2])
A[curr]=temp[i1++];
else A[curr]=temp[i2++];
}
}
int main() {
int n;
scanf("%d", &n);
int *a, *temp;
a = new int[n];
temp = new int[n];
for(int i = 0; i < n; i++)
cin >> a[i];
mergesort(a, temp, 0, n - 1);
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
(3)快排(sort)
# include <iostream>
# include <algorithm>
using namespace std;
inline int findpivot(int *A, int i, int j) {//找到轴值
return (i + j) / 2;
}
inline int Partition(int *A, int left, int right, int& pivot) {//划分实现,
do {
while(A[++left] < pivot);
while((left < right) && (pivot < A[--right]));
swap(A[left], A[right]);
} while(left < right);
return left;
}
void qsort(int *A, int left, int right) {
if(right<=left)return ;//若无元素直接返回
int pivotindex=findpivot(A,left,right);//找到轴值,即数组中间的元素
swap(A[pivotindex],A[right]);//将轴值放在数组最后一个位置上,为了不影响对剩下数组的划分操作
int k=Partition(A,left-1,right,A[right]);//k是划分后右半部分的起始位置
swap(A[k],A[right]);//再将换到数组最后的原轴值换回来
qsort(A,left,k-1);//对轴值前半部分进行qsort排序
qsort(A,k+1,right);//对划分后的后半部分
}
int main() {
int n;
scanf("%d", &n);
int *a;
a = new int[n];
for(int i = 0; i < n; i++)
cin >> a[i];
qsort(a, 0, n - 1);
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
(4)希尔排序
# include <iostream>
# include <algorithm>
using namespace std;
void inssort(int *A, int n, int incr) {//传进去的incr是增量
for(int i = incr; i < n; i += incr)
for(int j = i; (j >= incr) && (A[j] < A[j - incr]); j -= incr)
swap(A[j], A[j - incr]);//交换值
}
void shellsort(int *A, int n) {
for(int i=n/2; i>2; i/=2)//这里的i是增量,刚开始以n/2作为增量,然后是n/4....,以此类推
for(int j=0; j<i; j++)
inssort(&A[j],n-j,i);//循环进行每一次增量后对应元素大小的判断和减缓
inssort(A,n,1);//最后一次增量为一排最后一次
}
int main() {
int n;
scanf("%d", &n);
int *a;
a = new int[n];
for(int i = 0; i < n; i++)
cin >> a[i];
shellsort(a, n);
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}