一、冒泡排序
1. 冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来
2. 每次都是比较相邻的两个数,如果后面的数比前面的数大,则交换这两个数的位置。第一趟直到最后两个数比较完毕后,最小的数就在最后一个了,也就是将最小的数归 位了。第二趟将第二小的数归位。
3. 每一趟只能确定将一个数归位。如果有n个数进行排序,只需将n-1个数归位,也就是进行n-1趟操作。每一趟都需要从第1位进行相邻两个数的比较,将较小的一个数放在 后面,直到最后一个尚未归位的数
4. 冒泡排序的核心部分是双重嵌套循环
#include <iostream>
using namespace std;
int main(){
int a[100],i,j,n,t;
cin>>n;
for(i=0;i!=n;i++)
cin>>a[i];
for(i=0;i<=n-2;i++)
for(j=0;j<=n-2;j++){
if(a[j]<a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(i=0;i!=n;i++)
cout<<a[i]<<" ";
return 0;
}
二、快速排序
1. 快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。
2. 该方法的关键在于切分:
a) 对于某个j,a[j]已经排定
b) a[lo]到a[j-1]中的所有元素都不大于a[j]
c) a[j+1]到a[hi]中的所有元素都不小于a[j]
3. 随意取a[lo]作为切分元素。从数组的左端开始向右扫描直到找到一个大于等于它的元素,再从数组的右端开始向左扫描直到找到一个小于等于它的元素,交换它们的位 置,以此保证左指针i的左侧元素都不大于切分元素,右指针j的右侧元素都不小于切分元素。当两个指针相遇,将切分元素a[lo]和左子数组最右侧的元素交换然后返回j即可
#include <iostream>
using namespace std;
int a[101],i,j,n,temp,t;
void quicksort(int left,int right){
if(left>=right)
return;
i=left;
j=right;
t=a[left];
while(i!=j){
while(a[j]>=t&&i<j)
j--;
while(a[i]<=t&&i<j)
i++;
if(i<j){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
a[left]=a[i];
a[i]=t;
quicksort(left,i-1);
quicksort(i+1,right);
return;
}
int main(){
cin>>n;
for(int k=0;k!=n;k++)
cin>>a[k];
quicksort(0,n-1);
for(int l=0;l!=n;l++)
cout<<a[l]<<" ";
return 0;
}