闲来无事,想总结一下,以后持续补充(我就是个大学生,拿网上的文章拼拼凑凑,就是想自己做个笔记,如果不合适,请私信我,侵删。不过应该没人会看一个学生写的笔记吧…哈哈)
算法一:插入排序(Insertsort)
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
算法稳定。
插入排序的时间复杂度为O(n*n). 空间复杂度为O(1)。最好的时间复杂度是O(n),最坏的时间复杂度也就是平均是O(n^2)。
图解,这幅图我看着挺好懂的。
代码如下
void insert_sort(int array[],unsigned int n)
{
int i,j;
int temp;
for(i = 1;i < n;i++) //数组从0开始,所以我们从第二位,也就是a[1]开始
{
temp = array[i];
for(j = i;j > 0&& array[j - 1] > temp;j--) //遍历已经排好序的数组序列,给他让出位置来
{
array[j]= array[j - 1];
}
array[j] = temp;//把他插进去
}
}
算法二:快速排序(有很多改进版本,这里只写普通的)
在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:
1.找一个基准,分区
2. 递归下去,把小于基准值元素的子数列和大于基准值元素的子数列排序。
3. 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
代码如下
void yyh(int left,int right){
int i=left,j=right;
if(i>=j) return;
int k=a[left];
while(i<j)
{
while(i<j&&a[j]>=k) j--;
a[i]=a[j];
while(i<j&&a[i]<=k) i++;
a[j]=a[i];
}
a[i]=k;
yyh(left,i-1);
yyh(i+1,right);}
算法三:希尔排序(选取其中较高效的一种代码实现方法)
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。平均时间复杂度:O(nlogn)。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率,但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
算法举例:
使数组中间隔为d的元素有序。开始时,d选择大一些,每组的元素少,但是组数多。之后不断的缩小d,此时每组的元素变多,而组数变少。当d=1时,只有一个组,所有元素都在这个组中,此时排序完成。下面以8个数字的数组举例。
通过图解应该很清楚了
下面是代码实现:
#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <math.h>
using namespace std;
const int maxn=1e5+10;
int A[maxn],n;
void shellsort