经典算法---冒泡排序 bubble-sort

时间复杂度: O ( n 2 ) O(n^2) O(n2)

思想:

从给定无序序列头部开始,两两比较,根据两者大小交换位置,直到将最大(或最小)的数据交换到队尾(将最大的放到最后即升序,将最小的放到最后即降序),从而成为有序序列的一部分 。下一次继续这个过程,直到所有数据元素都排好序 。

外层排序只要进行 l e n − 1 len-1 len1就可以排好了,内层排序只要排 l e n − 1 len-1 len1再减去已经排序好的 i i i个,即 l e n − i − 1 len-i-1 leni1。以下代码以升序排序.

  1. C语言实现

    void bubble_sort(int arr[], int len)
    {
        int i, j;
        for(i = 0; i < len-1; i++)
        {
            for(j = 0; j < len-i-1; j++)
            {
                if(arr[j]>arr[j+1])
                    swap_arr(arr, j, j+1);
            }
        }
    
    }
    
  2. Python实现

    def bubble_sort(alist):
        list1 = alist
    
        i = 0
        while (i < len(list1)):
            j = 0
            while (j < len(list1)-i-1):
                if (list1[j]>list1[j+1]):
                    list1[j], list1[j+1] = list1[j+1], list1[j]#交换
                j += 1
            i += 1
    

这种实现方法,有个问题,如果本来就是升序排好的,那么时间复杂度还是 O ( n 2 ) O(n^2) O(n2),这就有点傻了,所以可引入一个flag,内层循环如果出现不需要交换了,那么就表示待排序的都是有序的,这样的话,时间复杂度就是 O ( n ) O(n) O(n)

改进后的程序如下,最好情况时间复杂度为 O ( n ) O(n) O(n)

void bubble_sort_2(int arr[], int len)
{
	int i, j;
	int flag;
	for(i = 0; i < len-1; i++)
	{
		flag = 0;
		for(j = 0; j < len-i-1; j++)
		{
			if(arr[j]>arr[j+1])
			{
				swap_arr(arr, j, j+1);
				flag = 1;
			}
		}

		if(flag == 0)
			break;
	}
}

你可能感兴趣的:(算法)