几种排序算法的一个小结

几种排序算法的一个小结

鉴于自己老是学完就容易忘掉,就下定决心在重学的过程中写个博客留存下来,以后自己忘了可以又来看看回忆回忆,也可以给大家做一个小小的参考(欢迎大家来指出我的错误!)

  1. 冒泡排序
    算法思想:每一趟排序选出最大值放在最后面,以此类推。
    **eg:**对 3 7 4 2 6 1进行冒泡排序
    解:
    第一趟排序:
    【3 7】 4 2 6 1
    3 【7 4】 2 6 1
    3 4 【7 2】 6 1
    3 4 2 【7 6】 1
    3 4 2 6 【7 1】
    3 4 2 6 1 7

    代码实现:
#include <stdio.h>
void bubble(int arr[],int n) //交换算法
{
int i;
int temp;
for(i=0;i<n-1;i++)
{
  if(arr[i]>arr[i+1])  //若前面的数字大则与后面的数字交换
   {
     temp=arr[i];
     arr[i]=arr[i+1];
     arr[i+1]=temp;
     }
 }
 }
 void  bubbleSort(int arr[],int n) //排序算法
 {
   int i;
   for(i=n;i>=1;i--)
   {
   bubble(arr,i);
   }
 }
 int  main()
 {
    int arr[]={3,7,4,2,6,1};
    int i;
    bubbleSort(arr,6);
    for(i=0;i<6;i++)
       printf("%d",arr[i]);
     return 0;
  }
  1. 选择排序
    算法思想:每一趟把整段数组找一遍,找到最大的值,与最后一个数字交换。
    eg: 3 7 4 2 6 1
    解:
    第一趟:
    3 7 4 2 6 1
    3 1 4 2 6 7
    代码实现:
#include <stdio.h>
int findMaxPos(int arr[] , int n) //找到最大值的位置
{
  int  max= arr[0];
  int pos=0; 
  int i;
  for(i=0;i<n;i++)
  {
	    if(arr[i]>max)
	    {
	       max= arr[i];
	       pos=i; //记录最大值的位置
	      }
  }
      return pos;
}
void selectionSort(int arr[] , int n) //选择排序的算法
{
     while(n>1)//不停的将所选的最大值与最后一个数字进行交换
     {
     int pos = findMaxPos(arr , n);
     int temp = arr [pos];
     arr[pos] = arr[n-1];
     arr[n-1] = temp;
     n--;
     }
 }
int main()
{
   int  arr[]={ 3, 7 , 4 , 2 ,6 ,1 };
   selectionSort(arr,6);
   int i;
   for(i=0;i<6;i++)
        printf("%d\n",arr[i]);
    return 0;
}

3.插入排序
算法思想:每一趟将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。
eg: 3 6 7 4 2 1 5
解:
第一趟:
3 6 7 4 2 1 5
3 4 6 7 2 1 5
代码实现:

#include <stdio.h>

void insert(int arr[], int n)
{
	int key =arr[n];
	int i=n;
	while(arr[i-1]>key)
	{
		arr[i]=arr[i-1];
		i--;
		if(i==0)  break;
	}
	arr[i]=key;
}

void insertionSort(int arr[], int n)  // 插入排序的算法
{
	int i;
	for(i=1;i<n;i++)//不断的将后面较小的值插入到前面
	{
		insert(arr,i);
	}	
}
int main()
{
	int arr[]={3,6,7,4,2,1,5};
	insertionSort(arr,7);
	int i;
	for(i=0;i<7;i++)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
} 
  1. 堆排序
    知识梳理:
    堆:
    1.需为完全二叉树(生成节点的次序是从左往右 从上往下)
    2.树上的值需满足父节点的值大于子节点的值
    大根堆:
    每个节点的值都大于其左孩子和右孩子的节点的值(大到小)
    小根堆:
    每个节点的值都小于其左孩子和右孩子节点的值(小到大)

算法实现
1.将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端
2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1;
3.将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,循环执行此项操作,直至得到有序数组为止。
(总结:一直构造大根堆)
代码实现:

#include <stdio.h>

void swap(int arr[] , int i , int j)
{
	int temp = arr[i];
	arr[i]= arr[j];
	arr[j] = temp;
}
void heapify(int tree[] , int n, int i)
{   
    if( i >= n)  return; //递归出口 
	int c1=2*i+1;
	int c2=2*i+2;
	int max=i;
	if( c1 < n && tree[c1] > tree[max])
	    max =c1;
    if( c2 < n && tree[c2] > tree[max])
       max=c2;
    if(max != i)
    {
    	swap(tree,max,i);
    	heapify(tree,n,max);
	}
 } 
int main()
{
	int tree[]={4,10,3,5,1,2};
	int n=6;
	heapify (tree ,n , 0);
	int i;
	for(i=0;i<n;i++)
	printf("%d\n",tree[i]);
	return 0;
 } 

鉴于最近比较忙,就先写到这里,剩下的有时间再来补充

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值