首页 > 编程语言 >面试算法(排序)附带c++/python实现

面试算法(排序)附带c++/python实现

时间:2024-07-15 13:26:05浏览次数:13  
标签:nums python self 元素 c++ 附带 int 排序 size

        排序算法是面试中会经常会被问到的一类问题,如果可以掌握较多的排序算法,在面试过程中才更有机会被面试官看重哦,下面我们准备了一些常见的面试算法,并分别给出了c++和python的代码实现,小伙伴们一起学起来吧!

冒泡排序(Bubble Sort)

        基于交换的排序,每次遍历需要排序的元素,依次比较相邻的两个元素的大小,如果前一个元素大于后一个元素则两者交换,保证最后一个数字一定是最大的(假设按照从小到大排序),即最后一个元素已经排好序,下一轮只需要保证前面 n-1 个元素的顺序即可。

之所以称为冒泡,是因为最大/最小的数,每一次都往后面冒,就像是水里面的气泡一样。

排序(假设从小到大)的步骤如下:

  1. 从头开始,比较相邻的两个数,如果第一个数比第二个数,那么就交换它们位置。
  2. 从开始到最后一对比较完成,一轮结束后,最后一个元素的位置已经确定。
  3. 除了最后一个元素以外,前面的所有未排好序的元素重复前面两个步骤。
  4. 重复前面 1 ~ 3 步骤,直到所有元素都已经排好序。

冒泡排序c++实现

#include <iostream>
using namespace std;

void bubbleSort(int nums[],int size);
void printf(int nums[],int size);

int main() {
    int nums[] = {98,90,34,56,21};
    int size =  sizeof(nums)/sizeof(nums[0]);
    bubbleSort(nums,size);
    return 0;
}

void bubbleSort(int nums[],int size) {
  // 每轮针对前面(size-i)个数进行排序
  for (int i = 0; i < size - 1; i++) {
    cout<<"第" <<  (i + 1) << "轮交换开始" <<endl;
    // 每一轮排序,从第 0 个元素,到 size-1-i 个元素
    for (int j = 0; j < size - 1 - i; j++) {
      // 对比相邻的两个元素
      if (nums[j] > nums[j + 1]) {
        // 元素交换。使得大的元素在后面
        int temp = nums[j + 1];
        nums[j + 1] = nums[j];
        nums[j] = temp;
      }
      printf(nums,size);
    }
  }
}

void printf(int nums[],int size){
    for (int i = 0; i < size; i++) {
        cout<<nums[i]<<" ";
    }
    cout<<endl;
}

 冒泡排序python实现

class Solution:
    def bubbleSort(self, nums):
        size = len(nums)
        # 每轮针对前面(size - i)个数进行排序
        for i in range(size):
            print("第", (i + 1), "轮交换开始")
            for j in range(0, size - 1 - i):
                if nums[j] > nums[j + 1]:
                    nums[j], nums[j + 1] = nums[j + 1], nums[j]
            self.printNums(nums)

    def printNums(self, nums):
        for i in range(len(nums)):
            print("%d " % nums[i], end="")
        print("")


if __name__ == '__main__':
    solution = Solution()
    nums = [98, 90, 34, 56, 21]
    solution.printNums(nums)
    solution.bubbleSort(nums)

选择排序

        每次选择剩下的元素中最小的那个元素,与当前索引位置的元素交换,直到所有的索引位置都选择完成。

排序的步骤如下:

  • 从第一个元素开始,遍历其后面的元素,找出其后面比它更小的且最小的元素,若有,则两者交换,保证第一个元素最小。
  • 对第二个元素一样,遍历其后面的元素,找出其后面比它更小的且最小的元素,若存在,则两者交换,保证第二个元素在未排序的数中(除了第一个元素)最小。
  • 依次类推,直到最后一个元素,那么数组就已经排好序了。

选择排序c++实现

#include <iostream>
using namespace std;

void selectionSort(int nums[],int size);
void printf(int nums[],int size);

int main() {
   int nums[] = {98,90,34,56,21};
   int size =  sizeof(nums)/sizeof(nums[0]);
   printf(nums,size);
   selectionSort(nums,size);
   return 0;
}

void selectionSort(int nums[],int size) {
  int times = 0;
  int minIndex;
  for (int i = 0; i < size - 1; i++) {
    cout<< "第" << (i + 1) << "轮选择开始:"<<endl;
    minIndex = i;
    for (int j = i + 1; j < size; j++) {
      times++;
      if (nums[j] < nums[minIndex]) {
        minIndex = j;
      }
    }
    cout<<"交换 " << nums[i] << "和" << nums[minIndex]<<endl;
    int temp = nums[i];
    nums[i] = nums[minIndex];
    nums[minIndex] = temp;
    printf(nums,size);
  }
   cout<<"比较次数:"<< times<<endl;
}

void printf(int nums[],int size){
   for (int i = 0; i < size; i++) {
       cout<<nums[i]<<" ";
   }
   cout<<endl;
}

 选择排序python实现

class Solution:
    def selectionSort(self, nums):
        times = 0
        size = len(nums)
        minIndex, temp = 0, 0

        for i in range(size - 1):
            print("第", (i + 1), "轮选择开始:")
            minIndex = i
            for j in range(i + 1, size):
                times = times + 1
                if (nums[j] < nums[minIndex]):
                    minIndex = j
            print("交换 ", nums[i], "和", nums[minIndex])
            print(end="")
            temp = nums[i]
            nums[i] = nums[minIndex]
            nums[minIndex] = temp
            self.printNums(nums)
        print("比较次数:", times, end="")

    def printNums(self, nums):
        for i in range(len(nums)):
            print("%d " % nums[i], end="")
        print("")


if __name__ == '__main__':
    solution = Solution()
    nums = [98, 90, 34, 56, 21]
    solution.printNums(nums)
    solution.selectionSort(nums)

插入排序

        依次选择一个元素,插入到前面已经排好序的数组中间,确保它处于正确的位置,当然,这是需要已经排好的顺序数组不断移动。步骤描述如下:

  1. 从第一个元素开始,可以认为第一个元素已经排好顺序。
  2. 取出后面一个元素 n,在前面已经排好顺序的数组里从尾部往头部遍历,假设正在遍历的元素为 nums[i],如果 num[i] > n,那么将 nums[i] 移动到后面一个位置,直到找到已经排序的元素小于或者等于新元素的位置,将 n 放到新腾空出来的位置上。如果没有找到,那么 nums[i] 就是最小的元素,放在第一个位置。
  3. 重复上面的步骤 2,直到所有元素都插入到正确的位置。

插入排序c++实现

#include <iostream>
using namespace std;

void insertionSort(int nums[],int size);
void printf(int nums[],int size);

int main() {
    int nums[] = {98,90,34,56,21};
    int size =  sizeof(nums)/sizeof(nums[0]);
    printf(nums,size);
    insertionSort(nums,size);
    return 0;
}

void insertionSort(int nums[],int size) {
    if (nums == NULL) {
      return;
    }
    int index, temp;
    for (int i = 1; i < size; i++) {
      // 当前选择插入的元素前面一个索引值
      index = i - 1;
      // 当前需要插入的元素
      temp = nums[i];
      while (index >= 0 && nums[index] > temp) {
        nums[index + 1] = nums[index];
        index--;
      }
      // 插入空出来的位置
      nums[index + 1] = temp;
      cout<<"第" << i << "轮插入结果:"<<endl;
      printf(nums,size);
    }
  }

void printf(int nums[],int size){
    for (int i = 0; i < size; i++) {
        cout<<nums[i]<<" ";
    }
    cout<<endl;
}

插入排序python实现

class Solution:
    def insertionSort(self, nums):
        if len(nums) == 0:
            return
        size = len(nums)
        index, temp = 0, 0
        for i in range(1, size):
            # 当前选择插入的元素前面一个索引值
            index = i - 1
            # 当前需要插入的元素
            temp = nums[i]
            while index >= 0 and nums[index] > temp:
                nums[index + 1] = nums[index]
                index = index - 1
            # 插入空出来的位置
            nums[index + 1] = temp
            print("第 %d 轮插入结果:" %i)
            self.printNums(nums)

    def printNums(self, nums):
        for i in range(len(nums)):
            print("%d " % nums[i], end="")
        print("")


if __name__ == '__main__':
    solution = Solution()
    nums = [98, 90, 34, 56, 21]
    solution.printNums(nums)
    solution.insertionSort(nums)

希尔排序

        希尔排序(Shell's Sort)又称“缩小增量排序”(Diminishing Increment Sort),是插入排序的一种更高效的改进版本,同时该算法是首次冲破 O(

标签:nums,python,self,元素,c++,附带,int,排序,size
From: https://blog.csdn.net/weixin_43776107/article/details/140428599

相关文章

  • python 面试宝典
    50道必备的Python面试题(建议点赞)-阿里云开发者社区(aliyun.com) ▍2、为什么Python执行速度慢,我们如何改进它?Python代码执行缓慢的原因,是因为它是一种解释型语言。它的代码在运行时进行解释,而不是编译为本地语言。为了提高Python代码的速度,我们可以使用CPython、Numba,或......
  • 基于小波分析的糖尿病视网膜病变检测(Python)
    fromscipyimportmiscfromPILimportImagefromskimageimportexposurefromsklearnimportsvmimportscipyfrommathimportsqrt,pifromnumpyimportexpfrommatplotlibimportpyplotaspltimportnumpyasnpimportglobimportmatplotlib.pyplotas......
  • 简单的小波分析入门教程(第一部分,Python)
    importnumpyasnpimportmatplotlib.pyplotaspltimportpywtSimpleSignalAnalysisusingDWT#Generatethesignalt=np.linspace(0,1,1000,endpoint=False)signal=np.cos(2.0*np.pi*7*t)+np.sin(2.0*np.pi*13*t)#ApplyDWTcoeffs=p......
  • C++ STL is_sorted用法
    一:功能   检查一个区间内的元素是否有序,按升序(或降序)排列二:用法#include<algorithm>#include<iostream>intmain(){std::vector<int>data1={1,2,3,4,5};booltest1=std::is_sorted(data1.begin(),data1.end());std::cout<<std::boo......
  • Hypertable 基于C++开发编译环境部署
    一、安装gccyuminstallgccgcc-c++二、安装boostyuminstallboostboost-develboost1.42以上版本,执行以下脚本:tarxjvfboost_1_44_0.tar.bz2cdboost_1_44_0./bootstrap.sh--with-libraries=filesystem,iostreams,program_options,system,thread,graph,regex./bjam......
  • Python数据库应用
      通过文件操作可以实现简单的数据操作功能,如果要处理的数据量巨大,则需要将数据存储在数据库中。Python支持多种数据库。  本章主要介绍数据库概念以及结构化数据库查询语言SQL,分析并理解Python自带的轻量级关系数据库SQLlite的使用方法(同样用于MySQL数据库)  文......
  • 基于风光储能和需求响应的微电网日前经济调度(Python代码实现)
    目录0引言1计及风光储能和需求响应的微电网日前经济调度模型1.1风光储能需求响应都不参与的模型1.2风光参与的模型1.3风光和储能参与模型1.4风光和需求响应参与模型1.5风光储能和需求响应都参与模型 2需求侧响应评价2.1 负载率2.2可再生能源消纳率2.3用户......
  • 基于风光储能和需求响应的微电网日前经济调度(Python代码实现)
    目录0引言1计及风光储能和需求响应的微电网日前经济调度模型1.1风光储能需求响应都不参与的模型1.2风光参与的模型1.3风光和储能参与模型1.4风光和需求响应参与模型1.5风光储能和需求响应都参与模型 2需求侧响应评价2.1 负载率2.2可再生能源消纳率2.3用户......
  • Python酷库之旅-第三方库Pandas(023)
    目录一、用法精讲58、pandas.isnull函数58-1、语法58-2、参数58-3、功能58-4、返回值58-5、说明58-6、用法58-6-1、数据准备58-6-2、代码示例58-6-3、结果输出59、pandas.notna函数59-1、语法59-2、参数59-3、功能59-4、返回值59-5、说明59-6、用法59-6-1、......
  • C/C++ 避免缓冲区溢出的措施
    在C/C++中,缓冲区溢出是一种常见的安全问题,可以导致程序崩溃或安全漏洞。为了避免缓冲区溢出,可以采取以下防范措施:使用安全的函数:使用strncpy(), strncat(), snprintf()等函数代替strcpy(), strcat(), sprintf()等,这些函数允许你指定最大复制的字符数,从而避免溢出。......