第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序
1.快速排序
实现:
1.取中间一个数作为支点
2.分别在支点的左右两边进行查找,如果左边查找到比支点大,右边查找到比支点小,就交换位置,如此循环,比支点小的数就排在了左边,比支点大的就排在右边
3.左右两边再用递归排序,就可以完成排序操作
/**
*@brief 快速排序
*@params arr 数组 left 起始位置 right总点位置
*/
void quickSort(int arr[],int left,int right)
{
int i = left;
int j = right;
int pivot = arr[(left + right) / ]; // 支点
while(i <= j)
{
while(arr[i] < pivot)
{
i++;
} while(arr[j] > pivot)
{
j--;
} if(i<=j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
} // 递归
if(left < j)
{
quickSort(arr,left,j);
} if(i < right)
{
quickSort(arr,i,right);
}
}
2.冒泡排序
原理:如果当前这个数比下一个数大,则交换位置,经过一次之后最大的数就排到了数组的末尾,以此类推
void bubble(inti arr[],int n)
{
int i ;
int temp;
for(i=;i<n-;i++)
{
if(arr[i] > arr[i + ])
{
temp = arr[i];
arr[i] = arr[i + ];
arr[i + ] = temp;
}
} } void bubbleSort(int arr[],int n)
{
int i;
for(i = n; i>=; i--)
{
bubble(arr,i);
}
}
3.选择排序
思路:
1.首先在数组中找到最大值并记录其下标
2.然后最大值与数组下标为n-1的交换。
int findMaxPos(int arr[],int n)
{
int i;
int max = arr[];
int pos = ;
for(int i = ; i<n; i++)
{
if(arr[i] > max)
{
pos = i;
max = arr[i];
}
}
return pos;
} void selectSort(int arr[],int n)
{
while(n > )
{
int pos = findMaxPos(arr,n);
int temp = arr[pos];
arr[pos] = arr[n - ];
arr[n - ] = temp;
n--;
}
}
4.插入排序
思路:
1.首要条件:两个数及以上
2.取到当前要插入的元素,以前面一个比较,如果小于前面,则需要把前面的大数移位,直到不满足小于的条件,插入相应的位置
void insert(int arr[],int n)
{
int key = arr[n];
int i = n;
while(arr[i - ] > key)
{
arr[i] = arr[i - ];
i--;
if(i == )
{
break;
}
}
arr[i] = key;
} void insertionSort(int arr[],int n)
{
int i;
for(i=; i< n; i++)
{
insert(arr,i);
}
}
5.二分查找插入排序
/*
* 折半查找排序
* 思路:
* 1.直接插入排序中,通过二分查找待插入的位置pos
* 2.将pos + 1 到 i - 1元素往后移动一个位置
* 3.将带排序的元素复制到pos
*/ // 二分查找
/*
* 如查找的数组是: a[4] =[3,2,1,4] maxLength = 4 key对应数组下标的值;
* 第一次查找:pos = 0
* 第二次查找:pos = 1
* 第三次查找:pos = 2
* 第四次查找:
*/
int findPos(int a[],int maxLength,int key)
{
int i = , low =, hight = current - ,pos;
while(low <= hight)
{
pos = (low + hight) / ;
if(a[pos] > key){ // 向左边查找
hight = pos - ;
}else{
low = pos + ;
}else{
return pos; // 返回查找到的位置
} return -; // 没有找到
} // 插入排序
void binInsertSort(int a[])
{
int i = , temp,pos,j;
for(i = ; i<a.count; i++)
{
pos = findPos(a,i,a[i]);
temp = a[i];
for(j = i -;j >= pos;j--)
{
a[j + ] = a[j]; // 元素后移
}
a[pos] = temp;
}
}
6.归并排序
思路:就是将两个已经排好序的数组,合成一个排好序的数组
1.先把数组中单个元素看做是已经排好序的堆
2.合并两个相邻的堆,重复多次,就之后剩下两个在进行合并
int *sort(int a[],int b[])
{
int maxLength = a.length + b.length
int temp[maxLength]; int ai = ;
int bi = ;
int tempi = ;
while(ai < a.length && bi <b.length)
{
if(a[ai] < b[bi])
{
temp[tempi++] = a[ai++];
}
else{
temp[tempi++] = b[bi++];
}
} // 判断那个数组最长,把长出来的继续添加到temp数组中
while(ai < a.length) temp[tempi++] = a[ai++];
while(bi < b.length) temp[tempi++] = b[bi++]; return temp;
}
7.堆排序
思路:
1.先把要排序的数组如a[9]={20,50,20,40,70,10,80,30,60},构造堆(有大顶堆和小顶堆)
在构造有序堆时,我们开始只需要扫描一半的元素(n/2-1 ~ 0)即可,为什么?
因为(n/2-1)~0的节点才有子节点,如图1,n=8,(n/2-1) = 3 即3 2 1 0这个四个节点才有子节点
2.筛选
3.调整堆 private static void heapSort(int[] arr) {
int len = arr.length -1;
for(int i = len/2 - 1; i >=0; i --){ //堆构造
heapAdjust(arr,i,len);
} // 执行到这里,说明根节点(a[0])是最大值或者是最小值了
while (len >=0){
swap(arr,0,len--); //将堆顶元素与尾节点交换后,长度减1,尾元素最大
heapAdjust(arr,0,len); //再次对堆进行调整
}
} public static void heapAdjust(int[] arr,int i,int len){
int left,right,j ;
while((left = 2*i+1) <= len){ //判断当前父节点有无左节点(即有无孩子节点,left为左节点)
right = left + 1; //右节点或者写 2*i+2
j = left; //j"指针指向左节点"
if(j < len && arr[left] < arr[right]) //右节点大于左节点
j ++; //当前把"指针"指向右节点
if(arr[i] < arr[j]) //将父节点与孩子节点交换(如果上面if为真,则arr[j]为右节点,如果为假arr[j]则为左节点)
swap(arr,i,j);
else //说明比孩子节点都大,直接跳出循环语句
break;
i = j;
}
}
public static void swap(int[] arr,int i,int len){
int temp = arr[i];
arr[i] = arr[len];
arr[len] = temp;
}
第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序的更多相关文章
- 常见的排序算法(直接插入&选择排序&二分查找排序)
1.直接插入排序算法 源码: package com.DiYiZhang;/* 插入排序算法 * 如下进行的是插入,排序算法*/ public class InsertionSort { pub ...
- IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序
/*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...
- 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 第四篇 Integration Services:增量加载-Updating Rows
本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...
- 直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序
一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2).空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; ...
- 【译】第四篇 Integration Services:增量加载-Updating Rows
本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...
- Spring Cloud第十四篇 | Api网关Zuul
本文是Spring Cloud专栏的第十四篇文章,了解前十三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring C ...
- [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)
冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...
随机推荐
- python 使用__slots__
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Studen ...
- 转:SQL Server 批量插入数据的两种方法
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...
- 【Stage3D学习笔记续】真正的3D世界(三):纹理效果
混合模式: 代码 示例是<Stage3D指南>中的直接弄出来的,可以通过点击键盘上的Q.W.E这3个按键,更换混合模式.模型和纹理,可以直观的查看不同混合模式的效果,住:下方的地形使用&q ...
- Java的面向对象思想
多态性: 一种方法有多种实现,采用哪一种实现由Java虚拟机在运行时动态决定,这种能力成为动态绑定(dynamic binding),也称为多态性(polymorphism)(源于一个希腊单词,意为“ ...
- HTTP 与 HTTPS 的区别
本文转自:http://www.cnblogs.com/ok-lanyan/archive/2012/07/14/2591204.html HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的 ...
- win32进阶之路:给锁屏软件增加一个超链接按钮
前言: windows下一切皆窗口,我们看到的超链接也是窗口,效果图如下: 鼠标放在赵大哥博客园主页和关于软件两个按钮上,按钮上的字体会从绿色变成红色,同时鼠标指针变为手型,点下鼠标左键就会调用默认浏 ...
- jquery ajax 报交请求返回 HTTP 400 错误
提交请求的AJAX代码如下: 点击(此处)折叠或打开 $.ajax({ url: "${ctx}/selfhelp/userAttributeAnalysis/userAttributeLi ...
- ABAP 常用系统变量
SY-ABCDE 常量,A-Z字母表SY-BATCH 后台的程序运行SY-COLNO:当前选定列的列号SY-CPAGE 列表的当前显示页SY-CUCOL 屏幕,PAI 的水平光标位置SY-CUROW: ...
- [面试算法题重做]求1+2+...+n
题目:求1+2+…+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 不能用条件语句,基本上只有考虑递归. 常规解法: 利用构 ...
- php代理请求
$url = 'http://192.168.5.241:8893/index.php?a=SendMessage&m=taskSend'; $ci = curl_init ();/* Cur ...