【技术宅2】插入选择冒泡快速交换排序算法

//插入排序(一维数组)

//插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

function insert_sort($arr){

$count=count($arr);

for($i=1;$i<$count;$i++){

$tem=$arr[$i];// 获得当前值

$j=$i-1;// 获得当前值的前一个位置

while($arr[$j]>$tem){// 如果当前值小于前一个值切未到数组开始位置

$arr[$j+1]=$arr[$j];// 把前一个的值往后放一位

$arr[$j]=$tem;

$j--;// 位置递减

}

}

return $arr;

}

$array=array(1,3,6,2,4,8,5340,33,45,78,1000);

print_r(insert_sort($array));//Array ( 1 ,2 ,3 ,4 ,6 ,8 ,33,45,78,1000,5340)

//选择排序

//选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。

function select_sort($arr){

$count = count($arr);// 获得数组总长度

for($i=0; $i<$count; $i++){// 遍历数组

$k = $i;// 暂存当前位置

for($j=$i+1; $j<$count; $j++){// 遍历当前位置以后的数据

if ($arr[$k] > $arr[$j])// 如果有小于当前值的

$k = $j;// 暂存位置

if ($k != $i){

$tmp = $arr[$i];// 暂存最小值

$arr[$i] = $arr[$k];// 把当前值放到算好的位置

$arr[$k] = $tmp;// 把当前值换成算好的值

}

}

}

return $arr;

}

$array=array(1,3,6,2,4,8,5340,33,45,78,1000);

print_r(select_sort($array));//Array ( 1 ,2 ,3 ,4 ,6 ,8 ,33,45,78,1000,5340)

//冒泡排序

//冒泡排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

function bubble_sort($arr){

$count=count($arr);                   // 获得数组总长度

if($count<=0) return false;

for($i=0; $i<$count; $i++){           // 正向遍历数组

for($j=$count-1; $j>$i; $j--){    // 正向遍历数组

if ($arr[$j] < $arr[$j-1]){   // 相邻两个数比较

$tmp = $arr[$j];          // 暂存较小的数

$arr[$j] = $arr[$j-1];    // 把较大的放前面

$arr[$j-1] = $tmp;        // 较小的放后面

}

}

}

return $arr;

}

$array=array(1,3,6,2,4,8,5340,33,45,78,1000);

print_r(bubble_sort($array));//Array ( 1 ,2 ,3 ,4 ,6 ,8 ,33,45,78,1000,5340)

//快速排序

//快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。

function quick_sort($array){

if (count($array) <= 1) return $array;

$key = $array[0];

$left_arr = array();

$right_arr = array();

for ($i=1; $i<count($array); $i++){// 从索引的第二个开始遍历数组

if ($array[$i] <= $key)// 如果值小于索引1

$left_arr[] = $array[$i];// 装入左索引数组(小于索引1的数据)

else

$right_arr[] = $array[$i];// 否则装入右索引中(大于索引1的数据)

}

$left_arr = quick_sort($left_arr);

$right_arr = quick_sort($right_arr);

return array_merge($left_arr, array($key), $right_arr);

}

$array=array(1,3,6,2,4,8,5340,33,45,78,1000);

print_r(quick_sort($array));//Array ( 1 ,2 ,3 ,4 ,6 ,8 ,33,45,78,1000,5340)

// 交换法排序

function ExchangeSort($arr){

$num = count($arr);

for($i=0;$i<$num-1;$i++){

for($j=$i+1;$j<$num;$j++){

if($arr[$j]<$arr[$i]){

$iTemp = $arr[$i];

$arr[$i] = $arr[$j];

$arr[$j] = $iTemp;

}

}

}

return $arr;

}

$array=array(1,3,6,2,4,8,5340,33,45,78);

print_r(ExchangeSort($array));//Array ( 1 ,2 ,3 ,4 ,6 ,8 ,33,45,78,1000,5340

时间: 2024-12-11 23:00:06

【技术宅2】插入选择冒泡快速交换排序算法的相关文章

选择 冒泡 快速 插入排序

/** * 演示各种排序法 */package com.test1;import java.util.*;public class Demo5_3 { public static void main(String[] args) { // TODO Auto-generated method stub int len=8; int arr1[]=new int[len]; for(int i=0;i<len;i++) { //让程序随机产生一个1-10000的数 //Math.random()会

排序算法之冒泡&amp;快速&amp;桶式算法

1 <?php 2 3 /** 4 * 冒泡排序算法(从小到大) 5 * @param array &$arr 待排序数组 6 */ 7 function bubbleSort(&$arr){ 8 $flag = 0; 9 $arr_size = count($arr); 10 for($i=1; $i<=$arr_size-1; ++$i){ 11 12 for($j=0; $j<$arr_size-$i; ++$j){ 13 if($arr[$j] > $arr

八大内部排序算法(上)-冒泡、直接插入、简单选择、快速

八大内部排序算法(上)冒泡.直接插入.简单选择.快速 排序分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 1.直接插入排序 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 直接插入实现如下:

基础排序算法—冒泡,插入,选择

前言 冒泡,插入,选择这三种基础的排序算法,比较简单效率不高,工作中一般不会使用,但是当做算法来研究还是能了解一些知识的,本文以<数据结构与算法之美>为基础,详细解析一下. 正文 首先要引入几个概念 稳定性 如果待排序数组中有相同的元素,排序过后它们的相对顺序不发生变化. 比如 2,9,3,4,8,3 排序过后为2, 3 , 3, 4, 8, 9 这两个3的相对顺序不变.这样就是具有稳定性. 稳定性可以保证复杂数据结构排序时的相对有序性. 比如我们要对一笔订单先按金额排列,金额相同的再按时间排

高维数据的快速最近邻算法FLANN

1.     简介 在计算机视觉和机器学习中,对于一个高维特征,找到训练数据中的最近邻计算代价是昂贵的.对于高维特征,目前来说最有效的方法是 the randomized k-d forest和the priority search k-means tree,而对于二值特征的匹配 multiple hierarchical clusteringtrees则比LSH方法更加有效. 目前来说,fast library for approximate nearest neighbors (FLANN)

快速乘法/快速幂 算法

快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩阵快速乘法 一.整数运算:(快速乘法.快速幂) 先说明一下基本的数学常识: (a*b) mod c == ( (a mod c) * (b mod c) ) mod c //这最后一个mod c 是为了保证结果不超过c 对于2进制,2n可用1后接n个0来表示.对于8进制,可用公式 i+3*j ==

交换排序算法

交换排序的基本思想是:两两比较待排序记录的关键字,一旦发现两个记录不满足次序要求时则进行交换,直到整个序列全部满足要求为止. 交换排序算法分为冒泡排序和快速排序 冒泡排序(Bubble Sort)是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上"漂浮"(左移) 或者使关键字大的记录如石块一样逐渐向下"坠落"(右移). 代码 void bubbleSort(int[] list){ for(i

JAVA算法4——连通性问题之路径压缩的加权快速合并算法

能否找到一个保证线性时间性能的算法,这个问题非常难.还有一些改进加权快速合并算法的简单方法.理想情况下,我们希望每个结点直接连到其树根,但又不想像快速合并算法那样改变大量连线.我们可以简单地把所检查的所有结点连到根上,从而接近理想情况.我们可以很容易地实现此方法,方法名为压缩路径,在合并操作时,经过每条路径就加一条连线,也就是把一路上遇到的对应于每个顶点的id数组值都设为连到树根上.净结果就是几乎完全把树变平坦了,逼近快速查找法所获得的理想状态. 还有其他许多方法来实现路径压缩下面程序实现路径压

排序系列 之 简单选择排序及其改进算法 —— Java实现

简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 3,1,5,7,2,4,9,6(共8个数) 1.n=8 个数中,最小数值为1,与第一个数交换:1,3,5,7,2,4,9,6 2.剩下 n-1=7 个数中,最小数值为2,与第二个数交换:1,2,5,7,3,4,9,6 3.剩下 n-2=6 个数中,最小数值为3,与第三个数交换:1,2,3,7,5,4