您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法——排序算法总结

2019-03-11 20:17 309 查看

排序算法:
1、冒泡:对数据的有序性 敏感,一旦排序完成就会 立刻停止,如果待排序的数据是基本有序的,他的排序效率是非常高的。 也是实现最简单的排序,代码不易出错,安全性高。
2、插入:在已经有序的数据中,添加新的数据,对这个组数据再进行排序比较适合插入排序。
3、选择:是冒泡排序的变种,不是正统的排序方法,但代码简单,容易构思
4、快速:在所有排序中平均速度最快的一种
5、归并:把待排序的数据拆分成不可再拆分的数据对,再1:1 合并在一起,形成2:2,再把2:2合并在一起,形成4:4,直到数组排序完成。
6、堆:把待排序的数据看成一个完全二叉树。

代码如下:

#include <stdio.h>
#include <stdlib.h>

void show_arr(int arr[],size_t len);
{
for(int i=0; i<10;i++)
{
printf("%d ",arr[i]);
}
}

// 冒泡排序
void bubble_sort(int arr[],size_t len)
{
for(int i=1; i<len; i++)
{
bool flag = true;
for(int j=0; j<len-i; j++)
{
printf("*");
if(arr[j] > arr[j+1])
{
flag = false;
swap(arr[j],arr[j+1]);
}
}
if(flag) return;
}
}

// 插入排序
void insert_sort(int arr[],int end,int count)
{
for(int i=end+1,j; i<end+count; i++)
{
int val = arr[i];
for(j=i; j>=0; j--)
{
if(arr[j-1] > val)
arr[j] = arr[j-1];
else
break;
}
arr[j] = val;
}
}

// 选择排序
void select_sort(int arr[],size_t len)
{
for(int i=0; i<len-1; i++)
{
int min = i;
for(int j=i+1; j<len; j++)
{
1e84d

if(arr[min] > arr[j])
min = j;
}
if(min != i)
swap(arr[min],arr[i]);
}
}

//快速排序法
void _quick_sort(int arr[],size_t left,size_t right)
{
// 计算标杆的位置
int p = (left+right)/2;
// 备份标杆的值
int val = arr[p];

// 备份起点和终点
size_t l=left,r=right-1;
// 循环保证起点和终点不相遇
while(l<r)
{
// 在左边找出比标杆大的值
for(;l<p && arr[l]<=val; l++);
// 如果循环不是以l<p结束的说明找到大于标杆的值
if(l<p)
{
// 把大于标杆的值移动到标杆位置
arr[p] = arr[l];
// 这个数的位置就成了新的标杆位置
p = l;
}
// 大右边找到比标杆小的值
for(;p<r && arr[r]>val; r--);
// 如果循环不是以p<r结束的说明撕开小于标杆的值
if(p<r)
{
// 把小于标杆的值值移动到标杆位置
arr[p] = arr[r];
// 这个数的位置就成了新的标杆位置
p = r;
}
}
// 还原标杆值
arr[p] = val;

// 排序标杆左边数据
if(p-left > 1) _quick_sort(arr,left,p);
// 排序标杆右边的数据
if(right-p > 2) _quick_sort(arr,p+1,right);
}

void quick_sort(int arr[],size_t len)
{
_quick_sort(arr,0,len);
}

int main()
{
int arr[10] = {};
for(int i =0 ;i<10; i++)
{
arr[i] = rand()%100;
}
show_arr(arr,len);
bubble();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: