几种排序算法的一个小结
鉴于自己老是学完就容易忘掉,就下定决心在重学的过程中写个博客留存下来,以后自己忘了可以又来看看回忆回忆,也可以给大家做一个小小的参考(欢迎大家来指出我的错误!)
- 冒泡排序
算法思想:每一趟排序选出最大值放在最后面,以此类推。
**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;
}
- 选择排序
算法思想:每一趟把整段数组找一遍,找到最大的值,与最后一个数字交换。
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.需为完全二叉树(生成节点的次序是从左往右 从上往下)
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;
}
鉴于最近比较忙,就先写到这里,剩下的有时间再来补充