C排序算法笔记

版权声明:谢谢你那么厉害还看了我的文章,欢迎转载交流学习~ 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]);
}
}

猜你喜欢

转载自blog.csdn.net/kilotwo/article/details/87803107