算法学习第一幕:排序算法1

排序算法应该是大学毕业后用到频率较高的为数不多的几个算法之一,通常情况下根据原理不同分为几个不同的类别,对我个人来说,主要的类别:

1,随意写随意用无视效率的冒泡,插入,选择三种基本排序

2,最常用的效率相对前三种较好的快速排序,快排

3,神特么除了多年写作业刷题库没有遇到过实际应用场景的堆排、归并排序

冒泡排序

首先我们介绍的是冒泡排序,这个应该是接触排序时学会的第一种排序方式,早在久远的初中普及VB时代就用过冒泡排序,其根本原理是每次比较相近的两处,如果二者顺序与要求的排序顺序相反则交换二者顺序,这样每次应该至少一个元素排到它所应该在的位置

 1 void maopao_sort(int a[])
 2 {
 3     int temp = 0;
 4     for(int i = 0; i < n - 1; i++) {
 5
 6         for (int j = 0; j < n - 1 - i; j++){
 7             if (a[j] < a[j+1]){
 8                 temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
 9             }
10         }
11         for(int i =0 ; i<10;i++)
12             cout<<a[i]<<" ";
13         cout<<endl;
14     }
15 }

运行结果:

从结果中我们很明显的看到,如果存在已经排好的序列,程序是依然会继续运行,直到彻底循环完O(n^2)才结束,针对这个,可以通过加入标识位来判断,如果已经排好序的位置,将不会进行处理。

 1 void maopao_sort2 ( int a[], int n) {
 2     int temp = 0;
 3     int i = n -1;  //初始时,最后位置保持不变
 4     while ( i > 0) {
 5         int flag = 0; //每趟开始时,无记录交换
 6         for (int j = 0; j < i; j++) {
 7             if (a[j]> a[j+1]) {
 8                 flag = j; //记录交换的位置
 9                 temp = a[j];
10                 a[j]=a[j+1];
11                 a[j+1]=temp;
12             }
13         }
14         i= flag; //为下一趟排序作准备
15
16         for(int i =0 ; i<10;i++)
17             cout<<a[i]<<" ";
18         cout<<endl;
19     }
20 }

少了一次。。。。

插入排序

插入排序在我的理解里就像我们小时候打扑克摸牌,从牌堆里抽排,手初始时是空,然后按照从小到大,或者从大到小顺序排列,手中形成有序序列后,新摸得牌就会顺序检索它应该所在的为止,插入,插入位置后面的牌顺序后移一位

 1 void insertSort(int a[], int n)
 2 {
 3     for(int i = 1; i < n; i++) {
 4         if(a[i] < a[i - 1]){
 5             int j = i - 1;
 6             int x = a[i];
 7             a[i] = a[i-1];
 8             while(x < a[j]){
 9                 a[j+1] = a[j];
10                 j--;
11             }
12             a[j+1] = x;
13         }
14     }
15
16 }

效果如图。。。非常非常明显的看到,主要损失的效率在于存在较长的顺序序列时,该方法依然逐个进行。据说改进方法希尔排序属于插入排序升级版,因为并不熟悉,后期研究后加入。

选择排序

选择排序,选择最大/最小元素接在已拍好序列后

 1 for(int i = 0; i < n; i++){
 2     int min = a[i];
 3     int temp = 0;
 4     int index = i;
 5     for (int j = i + 1;j < n; j++) {
 6         if (a[j] < min) {
 7             min = a[j];
 8             index = j;
 9         }
10     }
11
12     temp = a[i];
13     a[i] = min;
14     a[index]= temp;
15 }

快速排序

快速排序,使用了分治和递归的方法,将排序的时间复杂度降到了nlgn,虽然不稳定,属于常用的理解很方便的一种排序,主要原理: 任选数组头尾任一元素作为标尺flag,将小于flag的元素放到左边,大于flag的元素放到右边,这样形成了两个小的序列,随后对这两个小序列如上方法进行递归。网上可以直接搜索快速排序gif,很简洁明了的告诉如何实现的。

 1 void quick_sort(int a[], int left, int right)
 2 {
 3     if(left<right)
 4     {
 5         int i = left;
 6         int j = right;
 7         int x = a[i];
 8
 9         while(i<j)
10         {
11             while(i<j&&a[j]>x)
12                 j--;
13             if(i<j){
14                 a[i] = a[j];
15                 i++;
16             }
17             while(i<j&&a[i]<x)
18                 i++;
19             if(i<j){
20                 a[j] = a[i];
21                 j--;
22             }
23         }
24         a[i] = x;
25         quick_sort(a, left, i-1);
26         quick_sort(a, i+1, right);
27     }
28 }

时间: 2024-10-10 02:54:50

算法学习第一幕:排序算法1的相关文章

链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学习过算法的系统性的课程,现在还是处于不断摸索的阶段,好多算法题目根本就没有什么思路,导致自己对好多题目都很是头疼,就算是自己做过的一些算法的题目,再次遇到也还是不一定会做出来,他给出的建议就是,看懂别人的程序,然后自己去敲,一定会出错,然后调试,有错误接着调试,一直到没有错误为止,并且要时常的去复习

数据结构与算法系列十(排序算法概述)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

基本算法研究1-冒泡排序算法测试

基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于每次把最大数据像气泡一样浮到水面一样.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换. 基本步骤: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个.        2.对每一对相邻元素作同样的工作,从开始第一对

算法导论专题一--排序算法

排序算法作为许多程序的中间步骤,是计算机科学中的一个基本操作. 一.问题描述 排序算法输入的是n个数的一个序列<a1,a2…..an>,输出为输入的一个排列<a1’,…..an’>,满足a1’<a2’<….<an’ 简言之就是输入一个序列,输出的是这个数组元素从小到大排列的另一序列. 二.方法思想综述 从算法导论这本书上根据算法的复杂度可以将排序算法分为三种,,.,这两种方法都需要数据间的比较,而不需要. 其中有三种为选择,冒泡,插入. 选择排序:最直观,简单但是

算法导论专题一--排序算法(2)

上节分析了O(n^2)的算法,这节就分析O(nlgn)的算法-归并,快速和堆排序. 一:综述 O(nlgn) 的算法可以分为两大类,两者所用的技术差别较大.归并和快速排序采用的是分治策略,这两者相当于一个对称的过程,一个是自顶向上合并子问题,另一个则自上向下分解子问题.而堆排序利用堆这一数据结构元素间的特殊关系来排序一个序列,另外采用二叉树的方式组织数据使其效率大大提高. 二:分治策略排序算法 1.为什么使用分治? 在上节算法的分析中,不管是冒泡.选择还是插入都不适用于大规模的数据,因为数据一大

python数据结构与算法第八天【排序算法】

1.排序算法的稳定性 稳定排序算法会让原本有相同键值的记录维持相对次序 例如:对以下元组按照元组的第一个元素升序排列,元组如下: (4,1) (3,1) (3,7) (5,6) 若要满足条件,则可能的排序有: 情况一: (3,1) (3,7) (4,1) (5,6) 情况二: (3,7) (3,1) (4,1) (5,6) 虽然情况一和情况二都是满足条件的,但是情况二在满足条件下打破了原本无需改变的顺序 原文地址:https://www.cnblogs.com/liuzhiqaingxyz/p/

【JavaScript】【算法】JavaScript版排序算法

JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) 1 //排序算法 2 window.onload = function(){ 3 var array = [0,1,2,44,4, 4 324,5,65,6,6, 5 34,4,5,6,2, 6 43,5,6,62,43, 7 5,1,4,51,56, 8 76,7,7,2,1, 9 45,4,6,7,8]; 10 //var array = [4,2,5,1,0,3]; 11 array

冒泡排序算法和简单选择排序算法的js实现

之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(data) { for(let i=0;i<data.length-1;i++){ for(let j=0;j<data.length-1-i;j++){ if(data[j]>data[j+1]){ [data[j],data[j+1]]=[data[j+1],data[j]]; } } }

常见经典排序算法学习总结,附算法原理及实现代码(插入、shell、冒泡、选择、归并、快排等)

博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序.希尔排序.选择排序.冒泡排序.快速排序.堆排序.归并排序)进行了详解.每一种算法都有基本介绍.算法原理分析.算法代码. 转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/47280135 插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过