冒泡排序及原理

1 .冒泡排序排序一串数字
算法原理:每次对相邻的两个元素进行比较,若前者大于后者则进行交换, 如此一趟下来最后一趟的就是最大元素,重复以上的步骤,除了已经确定的元素


void bubble_sort( int arr [], int sz )
{
         int i = 0;
         int j = 0;
         for (i = 0; i < sz ; i++)
        {
                for (j = 0; j < sz -i-1; j++)
               {
                        if ( arr [j]> arr [j + 1])
                       {
                               int temp = arr [j];
                               arr [j] = arr [j + 1];
                               arr [j + 1] = temp;
                       }
               }
        }
}

算法优化:当里面的一层循环在某次扫描中没有交换则说明此时数组已经全部有序,无需再再次扫描。
所以可以添加一个标记每交换一次就进行标记,如果某次没有没有标记就说明已经有序了

void bubble_sort( int arr [], int sz )
{
         int i = 0;
         int j = 0;
         int flag = 1;
         int temp = 0;
         for (i = 0; i < sz ; i++)
        {
               flag = 0; //每次重置为0
                for (j = 0; j < sz -i-1; j++)
               {
                        if ( arr [j]> arr [j+1])
                       {
                              temp = arr [j];
                               arr [j] = arr [j + 1];
                               arr [j + 1] = temp;
                              flag = 1;
                       }
               }
                if (!flag)
                        break ;
        }
}
算法优化:当里面的一层循环在某次扫描中没有交换则说明此时数组已经全部有序,无需再再次扫描。
所以可以添加一个标记每交换一次就进行标记,如果某次没有没有标记就说明已经有序了


int main( void )
         int arr[] = { 9,8,7,6,5,4,3,2,1 };
         int i = 0;
         int sz = sizeof (arr) / sizeof (arr[0]);
        bubble_sort(arr, sz);
         for (i = 0; i < sz; i++)
        {
               printf( "%d\n" , arr[i]);
        }
        system( "pause" );
         return 0;
}

2 .写冒泡排序可以排序多个字符串。
原理:如下题,假设对4个字符串进行排序,每个字符串不超过10个 ,那么可以把这三个字符串看成一个二维数组,这样一个一位数组的指针就可以访问该数组,然后根据冒泡排序的原理就可以排序了。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
void bubble_sort_str( char (* str )[10], int sz )
{
         int i = 0;
         int j = 0;
         char *temp[10] = { 0 }; //定义一个临时变量保存字符串
         for (i = 0; i < sz - 1; i++) //确定排序的趟数
        {
                for (j = 0; j < sz - 1 - i; j++) //每一趟排序的次数
               {
                        if (strcmp( str [j], str [j + 1])>0) //交换两个字符串的位置
                       {
                              strcpy(temp, str [j]);
                              strcpy( str [j], str [j + 1]);
                              strcpy( str [j + 1], temp);
                       }
               }
        }
}

int main( void )
{
         char arr[4][10] = { "dddd" , "ffff" , "bbbb" , "oooo" };
         int i = 0;
         char (*p)[10] = { 0 }; //定义一个数组指针
        p = arr; //p指向arr的第0行
         int sz = sizeof (arr) / sizeof (arr[0]); //求元素个数
        bubble_sort_str(*arr, sz);
         for (i = 0; i < sz; i++) //打印字符串
        {
               printf( "%s\n" , arr[i]);
        }
        system( "pause" );
         return 0;
}




猜你喜欢

转载自blog.csdn.net/qq_40955824/article/details/80473351