排序算法二(冒泡)(C+Python)

冒泡排序

时间复杂度O(n2),空间复杂度O(1),该排序算法稳定!

int swap(int a[],int i,int j){   //交换两元素的位置
	int temp = a[i];
	a[i] = a[j];
	a[j] = temp;
}

void bubbleSort(int a[],int n){
	for(int m = 0;m < n-1;m++){   //每次最大的元素都会放到最底端
		for(int k = 0;k < n-1-m;k++){   //比较相邻元素的大小,较大的后移
			while(a[k] > a[k+1]){
				swap(a,k,k+1);
			}
		}
	}
}
class BSList:
    def __init__(self, lis = None):
        self.lis = lis

    def bubble_sort_simple(self):
        length = len(self.lis)
        for i in range(length):
            for j in range(i + 1, length):
                if self.lis[i] > self.lis[j]:
                    self.lis[i], self.lis[j] = self.lis[j], self.lis[i]

    def bubble_sort(self):
        length = len(self.lis)
        for i in range(length -1,0,-1):
            count = 0
            for j in range(0,i):
                if self.lis[j] > self.lis[j + 1]:
                    self.lis[j],self.lis[j + 1] = self.lis[j + 1],self.lis[j]
                 count += 1
            if count == 0:
                return   

    def __str__(self):
        ret = ""
        for i in self.lis:
            ret += " %s" %i
        return ret


if __name__ == "__main__":
    bslist = BSList([4,1,7,2,9,0,3,2,5])
    bslist.bubble_sort_simple()
    print(bslist)
    bslist2 = BSList([4, 1, 7, 2, 10, 0, 3, 2, 5])
    bslist2.bubble_sort()
    print(bslist2)

注意在python实现的排序算法中,第一种与C实现的没有区别,时间复杂度为O(n^2);在第二种实现方式中,引入变量count,该变量用于当原数列为有序时,直接返回,减少排序时间!最理想的情况下时间复杂度为O(n)!

堆排序

https://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html
这里说的堆是指的一种数据结果,这个数据结果其实就是完全二叉树,对于完全二叉树,则除了叶子结点,别的结点都是由两个孩子的,分别是左孩子和右孩子,如果一个节点为i,则它的左孩子为2i+1,右孩子为2i+2。如果不理解可以看上面那个博客!它对整个过程作了详细的说明。
时间复杂度O(nlogn),空间复杂度 O(1),是不稳定的!注意,堆排序属于冒泡排序的进阶版!


void Heapify(int a[],int i,int size){   //从a[i]向下进行堆调整
	int left_child = 2*i+1;    //左孩子的索引
	int right_child = 2*i+2;   //右孩子的索引
	int max = i;       //先认为i为最大的值,然后与左右孩子比较,选出最大值
	if(left_child < size && a[left_child] > a[max])
		max = left_child;
	if(right_child < size && a[right_child] > a[max])
		max = right_child;
	if(max != i){
		int temp = a[i];
		a[i] = a[max];
		a[max] = temp;
		Heapify(a,max,size);   //通过递归调用,调整堆,在该代码中,是建立最大堆
	}
}
 
int BuildHeap(int a[],int n){   //建堆
	int heap_size = n;
	for(int i = heap_size/2 - 1; i >= 0; i--)  //从每一个非叶子结点开始往下调整
		Heapify(a,i,heap_size);
	return heap_size;
}
 
void HeapSort(int a[],int n){     
	int heap_size = BuildHeap(a,n);   //建立一个最大堆
	while(heap_size > 1){   //堆元素大于1,说明还没有完成排序
		int temp = a[0];    //将堆定元素和最后一个元素进行交换,并且在堆中去掉最后一个元素
		a[0] = a[--heap_size];
		a[heap_size] = temp;
		Heapify(a,0,heap_size);   //对新堆进行自顶而下的调整,形成最大堆
	}
}
class HeapSort:
    def __init__(self,lis):
        self.lis = lis

    def adjust_heap(self,lis,i,size):
        lchild = 2 * i + 1
        rchild = 2 * i + 2
        max = i
        if i < size // 2:
            if lchild < size and self.lis[lchild] > self.lis[max]:
                max = lchild
            if rchild < size and self.lis[rchild] > self.lis[max]:
                max = rchild
            if max != i:
                self.lis[max],self.lis[i] = self.lis[i],self.lis[max]
                self.adjust_heap(self.lis,max,size)

    def build_heap(self,lis,size):
        for i in range(0,(size//2))[::-1]:  #注意此处的写法,//是取整的意思
            self.adjust_heap(lis,i,size)

    def heap_sort(self,lis):
        size = len(self.lis)
        self.build_heap(lis,size)
        for i in range(0,size)[::-1]:
            self.lis[0],self.lis[i] = self.lis[i],self.lis[0]
            self.adjust_heap(lis,0,i)

    def __str__(self):
        ret = ""
        for i in self.lis:
            ret += " %s" %i
        return ret

def main():
    bslist = HeapSort([4, 1, 7, 2, 9, 0, 3, 2, 5])
    bslist.heap_sort(bslist)
    print(bslist)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值