冒泡算法--稳定排序算法
算法原理:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
时间复杂度:O(n^2)
C语言实现:
void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
选择排序--不稳定排序算法
算法原理:
每次选出最小元素,与指定位置元素交换。
第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
时间复杂度:O(n^2)
C语言实现:
void SelectSort(int a[],int n){
int i,j,k;
for(i=0;i<n;i++){
k=i;
for(j=i+1;j<n;j++){
if(a[k]>a[j]){
k=j;
}
}
if(k!=i){
SWAP(a[k],a[i]);
}
}
}
插入排序---稳定排序
算法原理:
每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
时间复杂度: O(n^2)
c语言实现:
void InsertSort(int a[],int n){
int i,j,k;
for(i=1;i<n;i++){
k=a[i];
for(j=i-1;j>=0;j--){
if(a[j]>k){
a[j+1]=a[j];
}else{
break;
}
}
a[j+1]=k;
}
}
快速排序--不稳定排序
算法原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
时间复杂度:O(nlog2n)
C语言实现:
void sort(int *a, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j)
{
while(i < j && key <= a[j])
{
j--;
}
a[i] = a[j];
while(i < j && key >= a[i])
{
i++;
}
a[j] = a[i];
}
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);
}