最近在看数据结构与算法分析,想写个笔记记录一下,先从基本的冒泡、选择、插入开始吧。
注:都是以增序为例说明
一、冒泡排序
1、原理:从数组的第一个位置开始两两比较array[index]和array[index+1],如果array[index]大于array[index+1]则交换array[index]和array[index+1]的位置,止到数组结束;
从数组的第一个位置开始,重复上面的动作,止到数组长度减一个位置结束;
从数组的第一个位置开始,重复上面的动作,止到数组长度减二个位置结束;
。。。。
2、 时间复杂度:O(N²),进行了(n-1)*(n-2)....=n*(n-1)/2次比较和比较次数一半的交换次数(均况下),那么根据大O表示法时间复杂度为O(N^2)
3.程序实现示例
public void BubbleSort(int[] array)
{
int length = array.Length;
for (int i = 0; i <= length - 1; i++)
{
for (int j = length - 1; j > i; j--)
{
if (array[j] < array[j - 1] )
{
int temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
}
二、选择排序
1、原理:选择一个值array[0]作为标杆,然后循环找到除这个值外最小的值(查找小于标杆的最小值),交换这两个值,这时最小值就被放到了array[0]上,然后再将array[1]作为标杆,从剩下未排序的值中找到最小值,并交换这两个值。
如图:(数据结构与算法中的图)
2、时间复杂度:O(N^2),与冒泡排序相比减少了数组交换的次数
3. 程序实现示例
public void ChoiceSort (int [] array)
{
int min;
for(int i=0;i< array.Length-1;i++)
{
min=i;
for(int j=i+1;j< array.Length;j++)
{
if(list[j]<list[min])
min=j;
}
int t=list[min];
list[min]=list[i];
list[i]=t;
}
}
三、插入排序
1、原理:插入排序的思想是数组是部门有序的,然后将无序的部分循环插入到已有序的序列中
如图:(从数据结构与算法中摘得)
2、时间复杂度:插入排序对随即顺序的序列的时间复杂度也为O(N^2),但是对于基本有序的序列进行排序时间复杂度为O(N)
3. 程序实现示例
public void InsertSort (int [] array)
{
for(int i=1;i< array.Length;i++)
{
int temp = array [i]; //从无序表中取出的数,放在temp里面
for(int j=i;j>0&&temp< array [j-1];j--) // j>0&&temp< array [j-1]为每一轮排序停止的条件
{
array[j]= array[j-1];
}
array[j]=temp; //将被标记值插入最终移出的空位置
}
}
ps:
1) 稳定的:如果存在多个具有相同排序码的记录,经过排序后,这些记录的相对次序仍然保持不变,则这种排序算法称为稳定的。
插入排序、冒泡排序、归并排序、分配排序(桶式、基数)都是稳定的排序算法。
2)不稳定的:否则称为不稳定的。
直接选择排序、堆排序、shell排序、快速排序都是不稳定的排序算法