版权声明:谢谢你那么厉害还看了我的文章,欢迎转载交流学习~ https://blog.csdn.net/kilotwo/article/details/87803107
选择排序
选择排序的要义:从第一个元素开始,不断遍历后面的元素,选择最小或最大的元素与之交换,从而实现排序。
精髓:选择+标记下标+交换
void selectSort(int a[],int n)//选择排序就是要先选择出来最小(大)的
{
int i,j;
int min,temp;
for (i=0;i<10;i++)
{
min = i;
for (j=i+1;j<n;j++)
{
if (a[j]<a[min])
{
min =j;
}
}
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
完整例程如下:
/********************************************************************
日期: 2019/02/20
时间: 11:51
文件名: F:\CPROJECT\PROJECT\selectSort.c
格式: c
作者: $ kilotwo $
目的: 选择排序
*********************************************************************/
#include "stdio.h"
void selectSort(int a[],int n);
void main()
{
int i=0;
int a[]={0,2,3,1,4,8,6,7,5,9};
selectSort(a,10);
for (i=0;i<10;i++)
{
printf("%d ",a[i]);
}
}
void selectSort(int a[],int n)//选择排序就是要先选择出来最小的
{
int i,j;
int min,temp;
for (i=0;i<10;i++)
{
min =i;
for (j=i+1;j<n;j++)
{
if (a[j]<a[min])
{
min =j;
}
}
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
插入排序
插入排序的要义:假设首元有序,之后用后面的元素不断往前插入,使得插入后前半部分有序,后半部分无序,直到没有后半部分。
精髓:a[j]=a[j-1]
后移+往前插入
void insertSort(int a[],int n)
{
int i,j,temp;
for(i=1;i<n;i++) //从第二个开始
{
temp=a[j];
for(j=i;j>0&&a[j-1]<temp,j--)
{
a[j]=a[j-1]; //后移
}
a[j]=temp;
}
}
/********************************************************************
插入排序
*********************************************************************/
#include "stdio.h"
void insertSort(int a[],int n);
void main()
{
int i=0;
int a[]={5,2,4,6,3,1};
insertSort(a,6);
for (i=0;i<6;i++)
{
printf("%d ",a[i]);
}
}
void insertSort(int a[],int n)
{
int i,j;
int temp;
for (i=1;i<n;i++)//假设首元有序,从第二个元素开始
{
temp=a[i];
for (j=i;j>0 && a[j-1]>temp;j--)
{
a[j]=a[j-1];
}
a[j]=temp;
}
}
冒泡排序
精髓:比大小交换+沉底 (沉底到最后一个 ->沉底到倒数第二个 ->沉底到倒数第一个…)
时间复杂度:冒泡排序在平均和最坏情况下的时间复杂度都是O(n^2),最好情况下都是O(n);
空间复杂度:O(1);
稳定性:冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不必再去交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
/********************************************************************
日期: 2019/02/20
时间: 15:57
文件名: F:\CPROJECT\bouble.c
格式: c
作者: $ kilotwo $
目的: 冒泡排序
*********************************************************************/
#include "stdio.h"
void main()
{
int a[8]={3,2,5,8,4,7,9,5};
int i,j,temp;
for( i=0;i<8;i++)
{
for( j=0;j<7-i;j++) //沉底最后一个
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for (i=0;i<8;i++)
{
printf("%d ",a[i]);
}
}