中级天翼
选择排序:
选择排序是一种简单直观的排序算法。
它的主要原理就是每一次从待排序的数据元素中选择最大(或最小)的元素放到待排序序列的开头,依次确定第1位,第2位,第3位,……,第n-1位元素(则最后第n位也确定了)。
最后序列中的元素就按照从大到小(或从小到大)的顺序排列好了。
选择排序代码(从小到大):
#include<iostream>
using namespace std;
int a[10000],n,i,j,t;
int main() {
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n-1;i++) //依次确定a[1]~a[n-1]的值 {
for(j=i+1;j<=n;j++) {
if(a[j]<a[i]) //如果后面有元素a[j]比a[i]小 {
t=a[i];
a[i]=a[j]; //就把a[j]和a[i]的值交换,这样就能保证 a[i]的值是后面元素中的最小值
a[j]=t;
}
}
}
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
交换函数:swap
格式:swap(a,b)
作用:实现两个元素变量中数字的交换
举例:int a=1;b=2;
swap(a,b);
cout<<a<<’ ‘<<b;
则最后输出的时候输出的结果是:2 1
中级启示者
快速排序
一、什么是快速排序
快速排序是在冒泡排序基础上的优先排序法,几乎是目前所有排序法中速度最快的方法。在快速排序中,数据比较时从两端向中间进行,每次同时从两个子序列中进行比较定位,从而减少了比较次数和交换次数。
二、快速排序的基本思想
- 先从数据序列中选一个元素作为基准;
- 将序列中所有比该元素小的元素尽量往数组的左侧放,所
有比该元素大或者相等的元素都尽量往数组的右侧放; - 对左右两边分别用同样的方法处理直到每一一个待处理的序
列的长度为1。
三、快速排序的过程
以一个含6个元素的数组为例,演示一遍快速排序的过程。
数组元素a[1]~a[6]分别是:9,5,6,12,3,4
a[1…6]快速排序过程
定义指针i,指向数组左端点;指针j,指向数组右端点。设置标兵为a[mid]=6
当a[i]<a[mid]时,i往后移; 当a[j]>a[mid]时, j往前移。
当i和j停下时,如果i还在j的前面,则交换a[i]和a[j],并把指针各移一格。
最后当j>i时,递归地对从1到j和从i到6两个数组分别进行快速排序。
a[1…3]快速排序过程
定义指针i,指向数组左端点;指针j,指向数组右端点。设置标兵为a[mid]=5。
当a[i]<a[mid]时,i往后移;当a[j]>a[mid]时,j往前移。
当i和j停下时,如果i还在j的前面,则交换a[i]和a[j],并把指针各移一格。
最后当j>i时,递归地对从1到j和从i到3两个数组分别进行快速排序。
a[1…2]快速排序过程
a[4…6]快速排序过程
a[4…5]快速排序过程
a[1…6]的排序结果
最后从a[1]到a[6]都完成了排序
四、快速排序的特点
快速排序的时间复杂度为O(nlogn),要低于选择排序和冒泡排序点的时间复杂度O(n2)。是目前最快的排序方法。
快速排序和选择排序一样, 是一个不稳定的排序算法。插入排序和冒泡排序是稳定的排序算法。
实现核心
void qsort(int a[],int l,int r){
int i=l,j=r,mid=a[(l+r)/2];
while(i<=j){
while(a[i]<mid) i++;
while(mid<a[j]) j--;
if(i<=j){
swap(a[i],a[j]);
i++;
j--;
}
}
if(l<j) qsort(a,l,j);
if(i<r) qsort(a,i,r);
}
ps:你学递归了吗?