算法:
数据结构中的算法,指的是数据结构所具备的功能。
解决特定问题的方法,他是前辈们的一些优秀的经验总结。
现在我来介绍几种简单的排序算法:
冒泡排序:
是一种稳定排序,在排序过程中可以检测到数据是否已经有序(对数据的有序性非常敏感),可以立即停止,如果待排序的数据基本有序,则冒泡的效率非常高。
插入排序:
当一列数据已经有序,再有加入的数据时,适合使用插入排序。
选择排序:
是冒泡排序的变种,但是它没有冒泡对数据有序性的敏感,但它在排序过程比冒泡少了很多数据交换,因此数据比较混乱的情况下要比冒泡快。
算法的时间复杂度:
注意:时间复杂度不是算法运行所需要的时间,而是算法执行的次数,
| 最好状况 |
---|
插入排序 | O(n) |
冒泡排序 | O(n) |
选择排序 | O(N^2) |
| 平均状况 |
---|
插入排序 | O((n^2) |
冒泡排序 | O((n^2) |
选择排序 | O(n^2) |
排序算法的稳定性:
当序列中有相等的数据时,算法不会改变这两个数据的前后位置,
#include<stdio.h>
#define swap(a,b) {typeof(a) t=a;a=b; b=t;}
void bub_sort(int* arr,size_t len)
{
for(int i=0;i<len;i++)
{
for(int j=0;j<len-i-1;j++)
{
if(arr[j]>arr[j+1])
{
swap(arr[j],arr[j+1])
}
}
}
}
#include<stdio.h>
#define swap(a,b) {typeof(a) t=a;a=b; b=t;}
void insert_sort(int* arr,size_t len)
{
for(int i=1;i<len;i++)
{
int t=arr[i],k=i;
for(int j=i-1;j>=0&&arr[j]>t;j--)
{
arr[j+1]=arr[j];
k=j;
}
arr[k]=t;
}
#include<stdio.h>
#define swap(a,b) {typeof(a) t=a;a=b; b=t;}
void select_sort(int* arr,size_t len)
{
for(int i=len-1;i>0;i--)
{
int max=i;
for(int j=0;j<i;j++)
{
if(arr[j]>arr[max])
max=j;
}
if(max!=i)
swap(arr[max],arr[i]);
}
}