各大网站推荐/互联网运营推广公司
本章涉及三个排序算法。冒泡排序 、插入排序、合并排序(默认从小到大排)。
1、冒泡排序
是一种较流行的算法。重复交换相邻的反序元素,每一趟冒泡排序后,最大(最小)都被排在n,下一趟再从0到n-1,经过n趟,元素排列完毕。算法复杂度为O(n2),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h>
const int MAX_SIZE = 0xFFFFFF;
int test[MAX_SIZE];
int size;
void INIT() {
int i;
scanf("%d ",&size);
for(i = 0; i < size; i++)
{
scanf("%d ",&test[i]);
}
return;
}
void BUBBLE_SORT()
{
int i,j,tmp;
for(i = 0; i < size; i++)
{
for(j = 1; j < size-i; j++)
{
if(test[j] < test[j-1])
{
tmp = test[j-1];
test[j-1] = test[j];
test[j] = tmp;
}
}
}
return;
}
void PRINTF()
{
int i;
for(i = 0; i < size; i++)
{
printf("%d ",test[i]);
}
return;
}
void main ()
{
freopen("input.txt","r",stdin);
INIT();
BUBBLE_SORT();
PRINTF();
}
const int MAX_SIZE = 0xFFFFFF;
int test[MAX_SIZE];
int size;
void INIT() {
int i;
scanf("%d ",&size);
for(i = 0; i < size; i++)
{
scanf("%d ",&test[i]);
}
return;
}
void BUBBLE_SORT()
{
int i,j,tmp;
for(i = 0; i < size; i++)
{
for(j = 1; j < size-i; j++)
{
if(test[j] < test[j-1])
{
tmp = test[j-1];
test[j-1] = test[j];
test[j] = tmp;
}
}
}
return;
}
void PRINTF()
{
int i;
for(i = 0; i < size; i++)
{
printf("%d ",test[i]);
}
return;
}
void main ()
{
freopen("input.txt","r",stdin);
INIT();
BUBBLE_SORT();
PRINTF();
}
2、插入排序
类似打扑克抓牌是,从1到n开始将牌从一边依次寻找比它小(大),插入该位置,之后的元素都往后移一位。算法复杂度为O(n2),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h>
const int MAX_SIZE = 0xFFFFFF;
int test[MAX_SIZE];
int size;
void INIT() {
int i;
scanf("%d ",&size);
for(i = 0; i < size; i++)
{
scanf("%d ",&test[i]);
}
return;
}
void INSERTION_SORT()
{
int i,j,key;
for(j = 1; j < size; j++)
{
key = test[j];
i = j-1;
while(i >=0 && test[i] > key)
{
test[i+1] = test[i];
i--;
}
test[i+1] = key;
}
return;
}
void PRINTF()
{
int i;
for(i = 0; i < size; i++)
{
printf("%d ",test[i]);
}
return;
}
void main ()
{
freopen("input.txt","r",stdin);
INIT();
INSERTION_SORT();
PRINTF();
}
const int MAX_SIZE = 0xFFFFFF;
int test[MAX_SIZE];
int size;
void INIT() {
int i;
scanf("%d ",&size);
for(i = 0; i < size; i++)
{
scanf("%d ",&test[i]);
}
return;
}
void INSERTION_SORT()
{
int i,j,key;
for(j = 1; j < size; j++)
{
key = test[j];
i = j-1;
while(i >=0 && test[i] > key)
{
test[i+1] = test[i];
i--;
}
test[i+1] = key;
}
return;
}
void PRINTF()
{
int i;
for(i = 0; i < size; i++)
{
printf("%d ",test[i]);
}
return;
}
void main ()
{
freopen("input.txt","r",stdin);
INIT();
INSERTION_SORT();
PRINTF();
}
3、合并排序
采用分治的策略,将规模为n的待排元素一直二分,分到每堆有2个元素(n为奇数,有一堆为1个元素),然后取每两堆堆元素进行排序到一堆,一直合并到剩一堆。算法复杂度为O(n*logn),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h>
const int INF = 0xFFFFFF;
const int MAX_SIZE = 0xFFFF;
int test[MAX_SIZE];
int left[MAX_SIZE/2 + 1],right[MAX_SIZE/2 + 1];
int size;
void INIT() {
int i;
scanf("%d ",&size);
for(i = 0; i < size; i++)
{
scanf("%d ",&test[i]);
}
return;
}
void MERGE(int p, int q, int r)
{
int i,j,k,n1,n2;
n1 = q-p+1;
n2 = r-q;
for(i = 0; i < n1; i++)
{
left[i] = test[p+i];
}
for(j = 0; j < n2; j++)
{
right[j] = test[q+j+1];
}
left[n1] = INF; // 设置哨兵元素
right[n2] = INF;
i = 0;
j = 0;
for(k = p; k <= r; k++)
{
if(left[i] <= right[j])
{
test[k] = left[i];
i++;
}
else
{
test[k] = right[j];
j++;
}
}
return ;
}
void MERGE_SORT(int p,int r)
{
int q;
if(p < r)
{
q = (p+r)/2;
MERGE_SORT(p,q);
MERGE_SORT(q+1,r);
MERGE(p,q,r);
}
return;
}
void PRINTF()
{
int i;
for(i = 0; i < size; i++)
{
printf("%d ",test[i]);
}
return;
}
void main ()
{
freopen("input.txt","r",stdin);
INIT();
MERGE_SORT(0,size-1);
PRINTF();
}
const int INF = 0xFFFFFF;
const int MAX_SIZE = 0xFFFF;
int test[MAX_SIZE];
int left[MAX_SIZE/2 + 1],right[MAX_SIZE/2 + 1];
int size;
void INIT() {
int i;
scanf("%d ",&size);
for(i = 0; i < size; i++)
{
scanf("%d ",&test[i]);
}
return;
}
void MERGE(int p, int q, int r)
{
int i,j,k,n1,n2;
n1 = q-p+1;
n2 = r-q;
for(i = 0; i < n1; i++)
{
left[i] = test[p+i];
}
for(j = 0; j < n2; j++)
{
right[j] = test[q+j+1];
}
left[n1] = INF; // 设置哨兵元素
right[n2] = INF;
i = 0;
j = 0;
for(k = p; k <= r; k++)
{
if(left[i] <= right[j])
{
test[k] = left[i];
i++;
}
else
{
test[k] = right[j];
j++;
}
}
return ;
}
void MERGE_SORT(int p,int r)
{
int q;
if(p < r)
{
q = (p+r)/2;
MERGE_SORT(p,q);
MERGE_SORT(q+1,r);
MERGE(p,q,r);
}
return;
}
void PRINTF()
{
int i;
for(i = 0; i < size; i++)
{
printf("%d ",test[i]);
}
return;
}
void main ()
{
freopen("input.txt","r",stdin);
INIT();
MERGE_SORT(0,size-1);
PRINTF();
}
转载于:https://blog.51cto.com/aiguozhe/796665