冒泡排序:
这个算法大家估计很熟悉了,不做介绍了。
这里有一个算法优化的地方,那就是设置标志位,如果在上一趟的比较当中,没有进行交换的话,就说明已经排好序了,不需要再进行排序了。
演练程序:
- #include <stdio.h>
-
-
#define N 10
-
-
int main()
-
{
-
int a[N] = {62, 48, 35, 77, 55, 14, 35, 98, 22, 10};
-
int tmp, i, j, flag;
-
-
for(i = 0; i < N; i++) {
-
printf("%d ", a[i]);
-
}
-
printf("\n");
-
-
flag = 1;
- /*控制比较的趟数,总共比较N-1趟*/
-
for(i=0; i < N-1 && flag==1; i++) {
-
flag = 0;
- /*相邻的两个元素进行比较,把泡泡冒到最底*/
-
for(j=0; j < N-i-1; j++) {
-
if(a[j] > a[j+1]) {
-
tmp = a[j+1];
-
a[j+1] = a[j];
-
a[j] = tmp;
-
flag = 1;
-
}
-
}
-
}
-
-
for(i = 0; i < N; i++) {
-
printf("%d ", a[i]);
-
}
-
printf("\n");
-
return 0;
-
}
执行结果:
- 62 48 35 77 55 14 35 98 22 10
-
10 14 22 35 35 48 55 62 77 98
快速排序:
对于快速排序,一般是这么来设计的:首先保存第一个元素到一个变量x中,让它当作一个枢纽值,然后设置low和high下标分别指向最低处和最高处,总之,在一趟排序之后,x所放的位置要保证x前面的元素比x都小,x之后的元素都比x大就行了。
演练程序:
- #include <stdio.h>
-
-
#define N 10
-
-
int sort(int *a, int low, int high)
-
{
-
int pos, x;
-
-
x = a[low];
-
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;
-
pos = low;
-
return pos;
-
}
-
-
void quicksort(int *a, int low, int high)
-
{
-
int pos;
-
-
if(low < high) {
-
pos = sort(a, low, high);
-
quicksort(a, low, pos-1);
-
quicksort(a, pos+1, high);
-
}
-
}
-
-
int main()
-
{
-
int a[N] = {62, 48, 35, 77, 55, 14, 35, 98, 22, 10};
-
int i, j;
-
-
for(i = 0; i < N; i++) {
-
printf("%d ", a[i]);
-
}
-
printf("\n");
-
-
quicksort(a, 0, N-1);
-
-
for(i = 0; i < N; i++) {
-
printf("%d ", a[i]);
-
}
-
printf("\n");
-
return 0;
-
}
执行结果:
- 62 48 35 77 55 14 35 98 22 10
-
10 14 22 35 35 48 55 62 77 98
阅读(899) | 评论(0) | 转发(0) |