以前学过这三种方法,时间长不用都已经忘了,前天上算法设计课提到这三个算法,于是拿出来总结一下。
一、冒泡排序
基本原理 :相邻两个元素比较,大的一个后移。一趟可以把最大的数(或最少的数)排到最后面。然后进行第二趟比较。。一直得出结果。
比如10个数,a[10] = { 4 5 6 7 10 9 2 1 8 3 },以升序为例,4和5选比较,不交换;5和6比较,不交换;一直到10和9比较,交换一次。然后10和2比较,交换。。。一直把10交换到最后一个位置上。然后进行第二趟比较,可以把9交换到倒数第二个位置,以此类推。
代码实现:
#include<stdio.h>
void SortMaopao(int *num,int n);
int main()
{
int a[10];
int i;
printf("please input 10 numbers:\n");
for(i = 0; i < 10; i++)
{
scanf("%d",&a[i]);
}
SortMaopao(a,10);
for(i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void SortMaopao(int *a ,int n)
{
int i,j,t;
for(i = 0; i < n - 1; i++)
{
for(j = 0; j < n - 1 - i; j++)
{
if(a[j] > a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
二、选择排序
1.加入一个数组A = {5,3,6,2,4,7},我们对他进行排序
2.确定最小的元素放在A[0]位置,我们怎么确定呢,首先默认最小元素为5,他的索引为0,然后用它跟3比较,比他打,则认为最小元素为3,他的索引为1,然后用3跟6比,发现比他小,最小元素还是3,然后跟2比,最小元素变成了2,索引为3,然后跟4比,跟7比。当比较结束之后,最小元素也尘埃落定了。就是2,索引为3,然后我们把他放在A[0]处。为了使A[0]原有数据部丢失,我们使A[0](要放的位置) 与A[3](最小数据的位置)交换。这样就不可以了吗?
3.然后我们在来找第二小元素,放在A[1],第三小元素,放在A[2]。。当寻找完毕,我们排序也就结束了。
4.不过,在找的时候要注意其实位置,不能在找A[2]的时候,还用A[2]的数据跟已经排好的A[0],A[1]比,一定要跟还没有确定位置的元素比。还有一个技巧就是我们不能每次都存元素值和索引,我们只存索引就可以了,通过索引就能找到元素了。呵呵。
5.他和冒泡的相似和区别,冒泡和他最大的区别是他发现比他小就交换,把小的放上面,而选择是选择到最小的在直接放在确定的位置。选择也是稳定的排序。
代码实现:
#include<stdio.h>
void SelectSort(int *a,int n);
int main()
{
int a[10];
int i;
printf("please input 10 numbers:\n");
for(i = 0; i < 10; i++)
{
scanf("%d",&a[i]);
}
SelectSort(a,10);
for(i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void SelectSort(int *a, int n)
{
int i,minIndex,j;
for(i = 0; i < n - 1; i++)
{
minIndex = i;
for(j = i + 1; j < n ; j++)
{
if(a[minIndex] >= a[j])
{
minIndex = j;
}
}
if(i != minIndex)
{
int temp;
temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
}
三、快速排序
基本思想:取一个数为关键字key(一般取第一个数),然后把比key小的数放在key 的左边,比key 大的数放在key 的右边,可以快速分成两个子表,这叫一趟扫描。然后再用同样的方法对左子表和右子表分别进行扫描。
代码实现:
#include<stdio.h>
void QuickSort(int *a, int low, int high);
int QuickPass(int *a, int left, int right);
int main()
{
int a[10];
int i;
printf("please input 10 numbers:\n");
for(i = 0; i < 10; i++)
{
scanf("%d",&a[i]);
}
QuickSort(a,0,9);
for(i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void QuickSort(int *a, int low, int high)
{
int pos;
if(low < high)
{
pos = QuickPass(a, low, high);
QuickSort(a, low, pos - 1);
QuickSort(a, pos + 1, high);
}
}
int QuickPass(int *a, int left, int right)
{
int x, high ,low;
low = left;
high = right;
x = a[left];
while(low < high)
{
while(low < high && a[high] >= x)
high--;
if(low < high)
{
a[low] = a[high];
low++;}
while(low < high && a[low] < x)
low++;
if(low < high)
{
a[high] = a[low];
high--;
}
}
a[low] = x;
return low;
}