【Algorithm】排序之 “快排” 原理+python实现

快排

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def quick_sort(data,low,high):
    
    if low<high:

        i=low
        j=high
        temp=data[i]

        while i<j :
            if i<j and temp<=data[j]:
                j=j-1
            if i<j:
                data[i]=data[j]
            if i<j and temp>=data[j]:
                i=i+1
            if i<j:
                data[j]=data[i]
        data[i]=temp

        quick_sort(data,low,i-1)
        quick_sort(data,i+1,high)
        


if __name__=='__main__':
    data=[50, 36, 66, 76, 36, 12, 25, 95]
    # data=[0,1,2,3,4,5]
    print(data)
    quick_sort(data,0,len(data)-1)

    print(data)

ERROR

IndexError: list index out of range

原因:

  • list[index]中的index下标超出范围了,所以出现了访问越界;
  • list本身为空

经过检查发现,是

quick_sort(data,0,len(data))   # 错误
quick_sort(data,0,len(data)-1)

RecursionError: maximum recursion depth exceeded in comparison

超过了最大递归深度

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-means是一种常用的聚类算法,而K-means++是K-means算法的优化版本,它能够更好地初始化聚类中心,从而得到更好的聚类效果。下面是Python中K-means和K-means++的实现方法。 K-means实现: ```python import numpy as np def kmeans(X, k, max_iter=100): n_samples, n_features = X.shape centroids = X[np.random.choice(n_samples, k, replace=False)] for i in range(max_iter): clusters = [[] for _ in range(k)] for idx, x in enumerate(X): distances = [np.linalg.norm(x - c) for c in centroids] clusters[np.argmin(distances)].append(idx) new_centroids = np.zeros((k, n_features)) for idx, cluster in enumerate(clusters): new_centroids[idx] = np.mean(X[cluster], axis=0) if np.allclose(new_centroids, centroids): break centroids = new_centroids return centroids, clusters ``` K-means++实现: ```python import numpy as np def kmeans_pp(X, k, max_iter=100): n_samples, n_features = X.shape centroids = [] # choose first centroid randomly idx = np.random.choice(n_samples, 1, replace=False) centroids.append(X[idx]) # choose the rest of the centroids using k-means++ algorithm for i in range(1, k): distances = np.zeros(n_samples) for j, x in enumerate(X): distances[j] = np.min([np.linalg.norm(x - c) for c in centroids]) probabilities = distances / np.sum(distances) cumulative_probabilities = np.cumsum(probabilities) idx = np.searchsorted(cumulative_probabilities, np.random.rand()) centroids.append(X[idx]) centroids = np.array(centroids) # run k-means algorithm with the initial centroids for i in range(max_iter): clusters = [[] for _ in range(k)] for idx, x in enumerate(X): distances = [np.linalg.norm(x - c) for c in centroids] clusters[np.argmin(distances)].append(idx) new_centroids = np.zeros((k, n_features)) for idx, cluster in enumerate(clusters): new_centroids[idx] = np.mean(X[cluster], axis=0) if np.allclose(new_centroids, centroids): break centroids = new_centroids return centroids, clusters ``` 这两个函数的输入参数相同,其中X是数据集,k是聚类数量,max_iter是最大迭代次数。函数返回聚类中心和每个数据点所属的聚类编号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值