排序算法一览
来源:互联网 发布:军事坐标地图软件 编辑:程序博客网 时间:2024/05/29 07:29
排序算法一览 - [算法]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://lzhshen.blogbus.com/logs/20025537.html
1.冒泡排序,最简单也最常用的一种(^_^不复习的情况下,笔试遇到排序问题,我只能记住它),思想是:每次将数组前N个中最大(升序)或最小(降序)的数交换到数组底部,每次数组大小N--,再进行如此操作,直到所有的数都已排序即N=1。这样循环比较的次数是(n-1)+(n-2)+(n-3)....... 约等于(n)(n+1)/2, 时间复杂度为O(n2),N的平方。C语言实现如下:
void bubble_sort(int*array, int size)
{
int i, j, temp;
for (i=size-1; i>1; i--)
for (j=0; j<i; j++)
if (array[j]> array[j+1]){
temp = array[j+1];
array[j+1]= array[j];
array[j]= temp;
}
}
void change_sort(int*array, int size)
{
int i, j, temp;
for (i=0; i<size; i++)
for (j=i+1; j<size; j++)
if (array[i]>array[j]){
temp = array[j];
array[j]= array[i];
array[i]= temp;
}
}
void select_sort(int*array, int size)
{
int i, j, temp, pos;
for (i=0; i<size; i++){
for (j=i+1, temp=array[i], pos=i; j<size; j++)
if (temp > array[j]){
temp = array[j];
pos = j;
}
array[pos]= array[i];
array[i]= temp;
}
}
void insert_sort(int*array, int size)
{
int i, j, temp;
for (i=1; i<size; i++){
for (j=i, temp=array[i]; j>0&&temp<array[j-1];j--)
array[j]= array[j-1];
array[j]= temp;
}
}
void shell_sort(int*array, int size)
{
int gap, i, j,temp;
for (gap= size/2; gap>0;gap=(gap== 2 ?1:(int)(gap/2.2)))
for (i=gap; i<size; i++){
for (j=i,temp=array[i];j>=gap&& temp < array[j-gap]; j=j-gap)
array[j]= array[j-gap];
array[j]= temp;
}
}
voidmerge(int*array, int *temp_array,int left,int right,int right_end)
{
int left_end = right - 1, i;
int tmp =left;
int num = right_end- left+1;
while (left<= left_end&& right <= right_end)
if (array[left]<= array[right])
temp_array[tmp++]= array[left++];
else
temp_array[tmp++]= array[right++];
while (left<= left_end)
temp_array[tmp++]= array[left++];
while (right<= right_end)
temp_array[tmp++]= array[right++];
for (i=0; i<num; i++, right_end--)
array[right_end]= temp_array[right_end];
}
void m_sort(int*array, int *temp_array,int left,int right)
{
int center;
if (left< right){
center = (left+right)/2;
m_sort(array, temp_array,left, center);
m_sort(array, temp_array, center+1,right);
merge(array, temp_array,left, center+1,right);
}
}
void merge_sort(int*array, int size)
{
int *temp= (int*)malloc(size);
memset(temp, 0, size);
m_sort(array, temp, 0, size-1);
free(temp);
}
voidswap(int*a, int *b) //交换函数
{
int temp =*a;
*a =*b;
*b = temp;
}
int partition(int*array, int low, int high)
{
int middle = (low+high)/2, temp, pivot,i,j;
//选择第一个元素,最后一个元素,中间元素中的中间值作为支点
if (array[middle]< array[low])
swap(&array[middle],&array[low]);
if (array[high]< array[low])
swap(&array[high],&array[low]);
if (array[high]< array[middle])
swap(&array[high],&array[middle]);
pivot = array[middle];// 选中支点
swap(&array[middle],&array[high-1]);//将支点值换到倒数第二个位置
for (i=low, j=high-1;;) {
while (array[++i]<pivot){} //找到一个大于支点的元素
while (pivot<array[--j]){} //找到一个小于支点的元素
if (i < j){ //交换两个元素
temp = array[j];
array[j]=array[i];
array[i]=temp;
} else
break;
}
swap(&array[i],&array[high-1]);//将支点换回i点, 第一次分组结结束
return i;
}
void quicksort(int*array, int low, int high)
{
int piovt_pos;
if (low< high) {
piovt_pos = partition(array, low, high);//分组
quicksort(array, low, piovt_pos-1);
quicksort(array, piovt_pos+1, high);
}
}
void quick_sort(int*array, int size)
{
quicksort(array, 0, size-1);
}
void heapinsert(int*array, int pos, int data)//构建小顶堆,升序排列
{
int i;
for (i=pos; i/2>0; i/=2){
if (array[i/2]> data) //与父节点比较,大于父节点则交换位置
array[i]= array[i/2];
else
break;
}
array[i]= data; //插入
}
int heapdel(int*array, int len)
{
int min, last, i, j;
min = array[1];//堆顶元素删除
last = array[len--];
for (i=1; i*2<=len; i=j) {
j = i*2;//i的左儿子
if ((j!=len)&& (array[j+1]<array[j]))//看看哪个儿子可以填补空白
j++;
if (last > array[j])
array[i]= array[j];
else
break;
}
array[i]= last; //将最后一个元素填入空白
return min;
}
void heap_sort(int*array, int size)
{
int *temp= (int*)malloc(size+1);//方便编码,下标0的不用,从1开始
int i;
for (i=0; i<size; i++)
heapinsert(temp, i+1, array[i]);
for (i=0; i<size; i++)
array[i]= heapdel(temp, size-i);
array[size-1]= temp[1];
free(temp);
}
int get_radix(int num,int radix)//取得基数位的数
</
{
int temp;
for(int i=0; i<radix; i++){
temp = num%10;
num = num/10;
}
return temp;
}
void radix_sort(int*array, int size)
{
list<int> temp_list[10];
int max, radix, i, j, k;
char temp_buf[20];
list<int>::iterator iter;
memset(temp_buf, 0,sizeof(temp_buf));
max = array
}
- 排序算法一览
- 排序算法一览
- C++排序算法一览
- 排序算法一览
- 排序算法一览
- 排序算法一览
- 排序算法一览
- 排序算法一览
- 排序算法一览
- 排序算法一览
- STL中的排序算法一览
- STL中的排序算法一览
- STL中的排序算法一览
- STL中的排序算法一览
- [转载]STL中的排序算法一览
- STL中的排序算法一览[By ACM郭老师]
- (1.3.1)各查找和排序等算法一览
- 排序算法一览(上):交换类、选择类和插入类排序
- Mysql root导shell
- Listview动态加载数据
- extern 用法
- java语法——内部类
- Java InnerClass(内部类)
- 排序算法一览
- POJ3345 - 树型DP....要细心啊....T_T..
- PHP中 htmlspecialchars,htmlentities, nl2br函数
- 数对之差的最大值
- NC反弹Shell
- SQL Server 2005 中查询表结构及索引
- htmlspecialchars()函数 与 nl2br()函数 配合使用实例
- Hibernate缓存
- Windows Phone中Silverlight Toolkit的使用