排序代码(python,c++) 及 基本算法复杂度

0.导语

本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法:

  • 直接插入排序

  • 冒泡排序

  • 选择排序

  • 快速排序

  • 希尔排序

  • 堆排序

  • 归并排序

1.直接插入排序

算法思想

每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

代码实现

# 直接插入排序
def insert_sort(arr):length = len(arr)for i in range(length):k = ifor j in range(k,0,-1):if arr[j]<arr[j-1]:t = arr[j]arr[j]=arr[j-1]arr[j-1]=t
arr = [4,3,0,-1]
insert_sort(arr)
print(arr)

2.冒泡排序

算法思想

对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。

代码实现

# 冒泡排序
def bubbleSort(arr):length = len(arr)for i in range(length-1):flag = Truefor j in range(length-i-1):if arr[j]>arr[j+1]:t = arr[j]arr[j]=arr[j+1]arr[j+1]=tflag = Falseif flag:break
arr = [6,-2,0,9]
bubbleSort(arr)
print(arr)

3.选择排序

算法思想

每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序

代码实现

def selectSort(arr):length = len(arr)for i in range(length-1):min = ifor j in range(i+1,length):if arr[min]>arr[j]:min=jif min!=i:t = arr[i]arr[i]=arr[min]arr[min]=t
arr = [6,-2,0,9]
selectSort(arr)
print(arr)

4.快速排序

算法思想

快速排序思想----分治法。

  • 先从数列中取出一个数作为基准数。

  • 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

  • 再对左右区间重复第二步,直到各区间只有一个数。

每次划分得到,枢椎的左边比它小,右边比它大。

代码实现

方法一(通过遍历直接得到大于pivot和小于pivot的元素):

class Solution:def quicksort(self, array):""":type numRows: int:rtype: List[List[int]]"""if len(array)<=1:return arrayelse:pivot=array[0]small=[i for i in array[1:] if i<=pivot]big=[i for i in array[1:] if i >pivot]return self.quicksort(small)+[pivot]+self.quicksort(big)  //递归法,耗时

 方法二(双指针前后移动):

def quickSort(arr,left,right):# 递归终止条件if left>right:returnpivot = arr[left]i = leftj = rightwhile i<j:while i<j and arr[j]>=pivot:j-=1while i<j and arr[i]<=pivot:i+=1if i<j:t = arr[i]arr[i] = arr[j]arr[j] = t# 放入枢椎arr[left] = arr[i]arr[i]=pivot# 递归调用左区域quickSort(arr,left,i-1)# 递归调用右区域quickSort(arr,i+1,right)arr = [6,-2,0,9]
quickSort(arr,0,len(arr)-1)
print(arr)

5.希尔排序

算法思想

该算法也被称为:缩小增量排序

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

代码实现

# 希尔排序
def shellSort(arr):length =  len(arr)# 设置初始增量gap = length//2while gap>0:# 从第gap个元素,逐个对其所在组进行直接插入排序for i in range(gap,length):j = iwhile j-gap>=0 and arr[j]<arr[j-gap]:t = arr[j]arr[j] = arr[j-gap]arr[j-gap] = tj-=gapgap//=2
arr = [6,-2,0,9]
shellSort(arr)
print(arr)

6.堆排序

算法思想

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

基本思路:

  a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

  b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;(升序方法)

  c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

代码实现

方法1:

class HeapSort:def heapSort(self, nums):length = len(nums)# 从后往前遍历,交换堆顶与最后叶子节点,并依次调整堆,重复操作for j in range(length-1,0,-1):# 获取堆顶元素(获取同时,调整堆)firstNum = self.adjustHeap(nums,j+1)# 交换最后一个叶子节点与堆顶元素temp = nums[j]nums[j] = firstNumnums[0] = tempreturn nums# 调整堆(最大堆),每次返回最大堆顶元素def adjustHeap(self,nums,length):# 最后一个非叶节点i = length//2 -1# 从最后一个非叶节点开始调整,构成最大堆while i>=0:temp = nums[i]k = 2*i+1while k<length:if k+1<length and nums[k]<nums[k+1]:k+=1if nums[k]>temp:nums[i]=nums[k]i=kelse:breakk=2*k+1nums[i] = tempi-=1return nums[0]
s = HeapSort()
nums = [8,9,7,10]
t = s.heapSort(nums)
print(t)

方法2:

def buildMaxHeap(self,arr):import mathfor i in range(math.floor(len(arr) / 2), -1, -1):self.heapify(arr, i)def heapify(self, arr, i):left = 2 * i + 1right = 2 * i + 2largest = iif left < arrLen and arr[left] > arr[largest]:largest = leftif right < arrLen and arr[right] > arr[largest]:largest = rightif largest != i:self.swap(arr, i, largest)self.heapify(arr, largest)def swap(self, arr, i, j):arr[i], arr[j] = arr[j], arr[i]def heapSort(self, arr):global arrLenarrLen = len(arr)self.buildMaxHeap(arr)for i in range(len(arr) - 1, 0, -1):self.swap(arr, 0, i)arrLen -= 1self.heapify(arr, 0)return arr

7.归并排序

算法思想

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

代码实现

import math
class Solution:def mergeSort(self,arr):if (len(arr) < 2):return arrmiddle = math.floor(len(arr) / 2)left, right = arr[0:middle], arr[middle:]return self.merge(self.mergeSort(left), self.mergeSort(right))def merge(self,left, right):result = []while left and right:if left[0] <= right[0]:result.append(left.pop(0));else:result.append(right.pop(0));while left:result.append(left.pop(0));while right:result.append(right.pop(0));return result

 来自于wx公众号“光城”。

 

几种排序算法代码c++版本 (暂无堆排和希尔排序):

#include "../stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include<functional>
#include <map>
#include <iostream>
using namespace std;void BubbleSort(vector<int> &arr){if (arr.size() <= 0)return;for (int len = arr.size() - 1; len >= 1; len--){for (int i = 0; i < len; i++){if (arr[i]>arr[i + 1])swap(arr[i], arr[i + 1]);}}
}void SelectionSort(vector<int> &arr){if (arr.size() <= 0)return;for (int i = 0; i < arr.size() - 1; i++){int min_index = i;for (int j = i + 1; j < arr.size(); j++){/*if (arr[j]<arr[j-1])    //每次左边起始位置向前移一个,但是并不能保证一轮下来,左边的数为最小值swap(arr[j-1], arr[j]);*/min_index = arr[min_index] < arr[j] ? min_index : j;}swap(arr[min_index],arr[i]);}
}void InsertSort(vector<int> &arr){if (arr.size() <= 0)return;for (int i = 1; i < arr.size(); i++){ //从索引1开始,前面索引0区域为插入空间for (int j = i - 1; j >= 0 && arr[j]>arr[j + 1]; j--) //--逆序(直接和插入空间最右(也即最大)的数比较,就可知是否进行插入)swap(arr[j], arr[j + 1]); //不是i,j直接比较    j--决定插入的具体位置,如(1,3,5)2
    }
}void QuickSort(vector<int> &arr,int L, int R){if (L >= R) //递归终止条件return;int pivot = arr[L];int i = L, j = R;while (i != j){//先从右边找,否则会报错while (arr[j] > pivot&&i < j)j--;while (arr[i] <= pivot&&i < j)i++;if (i < j){swap(arr[i],arr[j]);}}arr[L] = arr[i];arr[i] = pivot; //最终pivot位置为iQuickSort(arr, L, i - 1);QuickSort(arr, i + 1,R);
}//归并:先拆分为若干子数组,通过merge()对其逐步合并排序
void Merge(vector<int> &arr, int L, int mid, int R){int i = L, j = mid + 1;vector<int> new_arr;while (i <= mid&&j <= R){if (arr[i] <= arr[j])new_arr.push_back(arr[i]),i++;elsenew_arr.push_back(arr[j]),j++;}while (i <= mid)new_arr.push_back(arr[i]), i++;while (j <= R)new_arr.push_back(arr[j]), j++;for (int k = L, t = 0; k <= R; k++, t++) //把值复制回原arrarr[k] = new_arr[t];
}void MergeSort(vector<int> &arr, int L, int R){if (L >= R)return;else{int mid = (L + R) / 2;MergeSort(arr, L, mid);MergeSort(arr, mid + 1, R);Merge(arr, L, mid, R);}
}int main(void){vector<int> array = {2, 1, 3, 5, 2, 6, 9, 2, 7 };//BubbleSort(array);//SelectionSort(array);//InsertSort(array);//QuickSort(array, 0, array.size() - 1);MergeSort(array, 0, array.size() - 1);vector<int> vec = array;vector <int>::iterator it;for (it = vec.begin(); it != vec.end();it++)cout << *it << endl;getchar();return 0;
}

 

 

基本算法复杂度:

参考来源:https://linux.cn/article-7480-1.html

 

 

转载于:https://www.cnblogs.com/nicetoseeyou/p/10512700.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP四层模型与OSI参考模型

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 TCP/IP四层模型&#xff1a; 1.链路层&#xff08;数据链路层/网络接口层&#xff09;&#xff1a;包括操作系统中的设备驱动程序、计算…

还驾驭不了4核? 别人已模拟出百万核心上的并行

摘要&#xff1a;不管是台式机还是笔记本&#xff0c;四核双核都已经不是新鲜的事了。计算机领域的你可能已经认识到了给电脑选配4核的处理器完全是一种浪费&#xff0c;因为大多数的程序都不支持多核心的并行处理。然而斯坦福的计算机科学家最近公布&#xff0c;他们已经模拟出…

Django内置权限扩展案例

当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统&#xff0c;Django内置权限系统基于model层做控制&#xff0c;新的model创建后会默认新建三个权限&#xff0c;分别为&#xff1a;add、change、delete&#xff0c;如果给…

Flutter Mac iOS 环境配置

官方文档&#xff1a;flutter.io/docs/get-st… 1.需要的命令行工具 bash curl git 2.x mkdir rm unzip which 2.SDK下载地址 flutter_macos_v1.0.0-stable.zip storage.googleapis.com/flutter_inf… 3.解压Flutter SDK cd ~/Flutter/SDK $ unzip ~/Downloads/flutter_macos_v…

IntelliJ IDEA中新建JAVA WEB项目、maven项目

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在IntelliJ IDEA 中新建一个Web应用项目。 1、 在主界面顶部菜单栏依次“File”-"New"-"Project..." 2、在对话框中…

S/4HANA业务角色概览之订单到收款篇

2019独角兽企业重金招聘Python工程师标准>>> 大家好我叫Sean Zhang&#xff0c;中文名张正永。目前在S/4HANA产品研发部门任职产品经理&#xff0c;而这一阶段要从2017年算起&#xff0c;而在那之前接触更多还是技术类的&#xff0c;比如做过iOS、HANA、ABAP、UI5等…

ItelliJ IDEA开发工具使用—创建一个web项目

转自&#xff1a;https://blog.csdn.net/wangyang1354/article/details/50452806概念需要明确一下IDEA中的项目&#xff08;project&#xff09;与eclipse中的项目&#xff08;project&#xff09;是不同的概念&#xff0c;IDEA的project 相当于之前eclipse的workspace,IDEA的M…

极客无极限 一行HTML5代码引发的创意大爆炸

摘要&#xff1a;一行HTML5代码能做什么&#xff1f;国外开发者Jose Jesus Perez Aguinaga写了一行HTML5代码的文本编辑器。这件事在分享到Code Wall、Hacker News之后&#xff0c;引起了众多开发者的注意&#xff0c;纷纷发表了自己的创意。 这是最初的HTML5代码&#xff0c;它…

DOCKER windows 7 详细安装教程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 DOCKER windows安装 DOCKER windows安装 1.下载程序包2. 设置环境变量3. 启动DOCKERT4. 分析start.sh5. 利用SSH工具管理6. 下载镜像 6.1…

芝麻信用免押金成趋势 报告称租赁经济有望突破10万亿元

中新网1月16日电 “很多物品都是租来的&#xff0c;但生活不是。”如今&#xff0c;越来越多的年轻人选择了“租”生活&#xff0c;从房子到车子&#xff0c;从服饰到电脑&#xff0c;甚至玩具、婴儿车&#xff0c;全都可以租用&#xff0c;租赁已成为当下年轻人追求品质生活的…

开发者成功学:扔掉你那些很sexy的想法

摘要&#xff1a;在开发者的世界里&#xff0c;开发iPhone应用并不像表面那么光鲜&#xff0c;收支不成正比是常有之事&#xff0c;劳心劳力开发的应用无人问津更是屡见不鲜。走出了开发的一小步却难以迈出销售推广上的一大步&#xff0c;究竟如何才能将应用卖出去并获取利润&a…

html-body相关标签

一 字体标签 字体标签包含&#xff1a;h1~h6、<font>、<u>、<b>、<strong><em>、<sup>、<sub> 标题 标题使用<h1>至<h6>标签进行定义。<h1>定义最大的标题&#xff0c;<h6>定义最小的标题。具有align属性&a…

CentOS上安装Docker (图解)

更简单的办法&#xff1a;三分钟装好 Docker ( 图解&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 // 用上面那个办法吧&#xff0c;简单多了&#xff0c;下面这个方法看看…

Uber提出有创造力的POET:自行开发更困难环境和解决方案

近日&#xff0c;Uber 发文介绍了一种开放式方法 POET&#xff08;Paired Open-Ended Trailblazer&#xff09;&#xff0c;可自行开发难度递增的环境及其解决方案&#xff0c;还可以实现不同环境中的智能体迁移&#xff0c;促进进化。Uber AI 实验室注重开放性&#xff08;ope…

C语言编译过程总结详解

源文&#xff1a;http://bbs.dzsc.com/space/viewspacepost.aspx?postid76976 C语言的编译链接过程要把我们编写的一个c程序&#xff08;源代码&#xff09;转换成可以在硬件上运行的程序&#xff08;可执行代码&#xff09;&#xff0c;需要进行编译和链接。编译就是把文本形…

promise之我见

在我们平时的方法中有很多方法是promise封装的&#xff0c; 有些函数后边跟的then和catch 就是promise的方法&#xff0c;先看一下pormise的特点 &#xff08;1&#xff09;对象的状态不受外界影响。Promise对象代表一个异步操作&#xff0c;有三种状态&#xff1a;pending&…

CPP虚析构函数

#include<iostream> using namespace std;class base {public:base(){};virtual ~base(){}; };// 在类声明中声明纯虚析构函数 //base::~base() {}class father: public base {public:~father(){cout << "father" << endl;} };int main() {base* a…

idea 新建springboot 的 web 项目

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 IDAE中新建web项目见&#xff1a;IntelliJ IDEA中新建JAVA WEB项目、maven项目 默认已有一个 maven 的 web 项目&#xff1a;gentle --…

从全栈式解决方案到情感化,揭秘问众智能切入车载语音市场的最佳姿势...

*问众智能CEO张亚 如果说语音交互是车载场景的最佳方式&#xff0c;未来谁掌握车内语音交互“话语权”&#xff0c;谁就将主宰车辆智能网联的新时代。 经过多年的渐进式发展&#xff0c;语音交互的价值正逐步走出单纯“控制方式”的狭隘理解&#xff0c;向业内人眼中的“智能…

阿里云日志添加要查询字段

第一步&#xff1a;在API基控制器&#xff08;base文件下&#xff09;下面 $arr 就是我要接受的所有参数值&#xff0c;而 msg_id就是我以后要在阿里云日志中查询的字段&#xff0c;以此字段统计某些数据 $arr 是前台API接口传过来的数据 &#xff0c;这里我需要使用 $arr[id] …