问题:
将数组a【begin, end】由小到大进行排序,
分析:
想一下我们一般怎样排序,先假设这个数组只有两个数,a[1]和[2],我们会这样做: 如果a[1]大于a[2]则交换这两个数,否则什么也不做。那么数组有n个数呢?不难发现我们总是把大的数放在右边,小的数放在左边,那么细想一下,很容易就会发现以下几种方法:
1:找出数组a[begin, end]中最大的数,然后将它与a[end]交换,再找出a[begin, --end]中最大的数与a[--end]交换,一直循环,直到begin=end;这样就排好了。同样我们可以找数组中最小的数和a[begin++]交换。
2:用循环从begin开始,到end结束,两个数为一组排好序,这样做,我们就可以把一部分大的数移向后面,将小的数移向前面,这还没有完,然后从begin+1开始,到end结束,使用相同的方法,这样循环n次,就排好了。
3:通过交换相邻的两个数,达到将大的数移向右边的目的,这样循环N次就排好了,这种方法每次循环的次数减小,就想起泡向上,所以又叫冒泡排序。
4:这个方法是最简单的也是最不容易想到的,叫做快排,就是找一个数如每次都找a[begin],将数组中比a[begin]大的数放在右边,比其小的数放在左边, 这也是这种方法最难的地方,然后以a[begin]为边界将数组分成两部分,对左右用相同的方法,这样就拍好了。
大家还可以想一想其他方法,还有很多,
代码:
1:
#include<stdio.h>
#define Max 8
int max(int a[], int size);
void sort(int a[], int size);
int main()
{
int a[Max]={1,4,5,2,78,12,9,7};
sort(a, Max);
return 0;
}
int max(int a[], int size)
{
int max=a[0], g=0, i;
for(i=1; i<size; i++)
if(max<a[i]) {
max=a[i];
g=i;
}
return g;
}
void sort(int a[], int size)
{
int i, g, temp;
for(i=0; i<size-1; i++) {
g=max(a, size-i);
temp=a[g];
a[g]=a[size-i-1];
a[size-i-1]=temp;
}
for(i=0; i<size; i++)
printf("%d ", a[i]);
puts("");
}
2:
#include<stdio.h>
#include <ctime>
#include <cstdlib>
#define Max 6
void sort(int a[], int begin, int end);
void swap(int *x, int *y);
int main()
{
int i, a[Max];
srand(time(NULL));
for (i=0; i<Max; ++i) {
a[i] = rand()%(Max*10);
printf("%d ", a[i]);
}
puts("");
sort(a, 0, Max);
return 0;
}
void swap(int *x, int *y)
{
int tem=*x;
*x=*y;
*y=tem;
}
void sort(int a[], int begin, int end)
{
int i, j;
for(j=0; j<Max; j++) {
for(i=0; i<=Max-2; i+=2)
if(a[i]>a[i+1])
swap(&a[i], &a[i+1]);
for(i=1; i<=Max-2; i+=2)
if(a[i]>a[i+1])
swap(&a[i], &a[i+1]);
}
for(i=0; i<Max; i++)
printf("%-3d", a[i]);
puts("");
}
3:
#include<stdio.h>
#define Max 5
void sort(int a[], int size);
int main()
{
int a[Max], i;
for(i=0; i<Max; i++)
scanf("%d", &a[i]);
sort(a, Max);
return 0;
}
void sort(int a[], int size)
{
int i, j;
for(i=0; i<size; i++)
for(j=0; j<size-i; j++)
if(a[j]>a[j+1]) {
int tem=a[j];
a[j]=a[j+1];
a[j+1]=tem;
}
for(i=0; i<size; i++)
printf("%d ", a[i]);
puts("");
}
4:
#include<stdio.h>
#include <ctime>
#include <cstdlib>
#define Max 10
void swap(int *x, int *y);
int f(int a[], int begin, int end);
int sort(int a[], int begin, int end);
int main()
{
int a[Max], i;
srand(time(NULL));
for (i=0; i<Max; ++i) {
a[i] = rand()%(Max*10);
printf("%d ", a[i]);
}
puts("");
sort(a, 0, Max-1);
for(i=0; i<Max; i++)
printf("%d ", a[i]);
puts("");
return 0;
}
void swap(int* x, int* y)
{
int tem=*x;
*x=*y;
*y=tem;
}
int sort(int a[], int begin, int end)
{
if(begin==end)
return 1;
int g=f(a, begin, end);
sort(a, begin, g);
sort(a, g+1, end);
}
int f(int a[], int begin, int end)
{
int i=begin, j=end, m=a[begin], *p=&a[begin];
while(begin<end)
if(a[++begin]>m)
while(end>begin) {
if(a[end]<m) {
swap(&a[begin], &a[end]);
break;
}
end--;
}
swap(p, &a[begin-1]);
return begin-1;
}