**********
交换排序
**********
1.冒泡排序
思想:
作n-1轮交换操作,交换是相邻项交换,一轮遍历就在最后面
成功交换出来一个最值了,后面得到的最值在下一轮中就不用管了。
#include <iostream>
using namespace std;
int main()
{
int a[10]={2,1,4,6,4,7,9,8,3,5};
for(int i=0;i<9;i++) //需要交换的轮数
{
for(int j=0;j<10-1-i;j++) //从数组起始一直到已经交换出的数为止,
{ //涉及到j+1,只需要到“当前末位置”前一个
if(a[j]>a[j+1])
{
int t=a[i];a[i]=a[j];a[j]=t;
}
}
}
for(int i=0;i<=9;i++)
cout<<a[i]<<' ';
cout<<endl;
}
2.快速排序
思想:
left位置取数作为基准(base)参照物,
从数组的right位置向前找,一直找到比(base)小的数,如果找到,将此数赋给left位置,
从数组的left位置向后找,一直找到比(base)大的数,如果找到,将此数赋给right的位置,
重复“第二,第三“步骤,直到left和right指针重合,最后将(base)插入到指针重合的位置,
第一遍的遍历完成(让left和right指针重合),数组出现切割点(切割点一边的数全小于分割点,一边全大于)。
然后对分割点两边继续进行分割,递归操作直到不能分割,排序完成。
代码实现:
递归操作,递归出口是数组左右指针重合;
充分利用了while循环的好处。
#include <iostream>
using namespace std;
void quicksort(int a[],int low,int high) //low和high参数指数组需要排列的首项和尾项
{
if(low<high) //递归条件(出口)
{
int i=low,j=high,temp=a[i];
while(i<j) //操作出口条件
{
while(a[j]>=a[i]&&j>i) //右指针左移动直到能赋值
j--;
a[i]=a[j];
while(a[i]<=a[j]&&i<j) //左指针右移动直到能赋值
i++;
a[j]=a[i];
}
a[i]=temp; //一轮遍历完成,i==j,赋基准值。
quicksort(a,low,i-1); //对分割点前面数据进行递归操作
quicksort(a,i+1,high); //对分割点后面数据进行递归操作
}
else return;
}
int main()
{
int a[10]={2,1,4,6,4,7,9,8,3,5};
quicksort(a,0,9);
for(int i=0;i<=9;i++)
cout<<a[i]<<' ';
cout<<endl;
}
**********
选择排序
**********
不断找最值,直到完成排序。
对求前K大问题很好。
3.直接选择排序:
思想:
对前n-1个数进行操作,
与他后面所有的数进行比较,比他大或者小就交换。
相当于每次找最值置于最前面。
#include <iostream>
using namespace std;
int main()
{
int a[10]={2,1,4,6,4,7,9,8,3,5};
for(int i=0;i<9;i++) //需要交换的数,只要到倒数第二个
{
for(int j=i+1;j<10;j++) // 需要交换的数后面开始一直到最后
{
if(a[i]>a[j])
{
int t=a[i];a[i]=a[j];a[j]=t;
}
}
}
for(int i=0;i<=9;i++)
cout<<a[i]<<' ';
cout<<endl;
}
4.堆排序
要知道堆排序,首先要了解一下二叉树的模型。
那么要实现堆排序,必须要做两件事情:
第一:构建大根堆。
第二:输出大根堆。
**********
其他排序
**********
5.插入排序:
直接插入和折半插入
6.希尔排序
7.归并排序
ps: 插入排序的时间复杂度为:O(N^2)
希尔排序的时间复杂度为:平均为:O(N^3/2)
最坏: O(N^2)
归并排序时间复杂度为: O(NlogN)
空间复杂度为: O(N)