麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開發(fā) > PHP > 正文

7種php基本排序?qū)崿F(xiàn)方法

2024-05-04 23:43:52
字體:
供稿:網(wǎng)友
這篇文章主要為大家詳細(xì)介紹了7種php基本排序?qū)崿F(xiàn)方法,感興趣的小伙伴們可以參考一下
 

本文總結(jié)了一下常用的7種排序方法,并用php語(yǔ)言實(shí)現(xiàn)。

1、直接插入排序

/* *  直接插入排序,插入排序的思想是:當(dāng)前插入位置之前的元素有序, *  若插入當(dāng)前位置的元素比有序元素最后一個(gè)元素大,則什么也不做, *  否則在有序序列中找到插入的位置,并插入 */function insertSort($arr) {  $len = count($arr);    for($i = 1; $i < $len; $i++) {    if($arr[$i-1] > $arr[i]) {      for($j = $i - 1;$j >= 0; $j-- ) {        $tmp = $arr[$j+1];        if($tmp < $arr[$j]) {          $arr[$j+1] = $arr[$j];          $arr[$j] = $tmp;        }else{          break;        }                }      }  }    return $arr;}

2、冒泡排序

/*  冒泡排序,冒泡排序思想:進(jìn)行 n-1 趟冒泡排序, 每趟兩兩比較調(diào)整最大值到數(shù)組(子數(shù)組)末尾*/function bubbleSort($arr) {  $len = count($arr);  for($i = 1; $i < $len; $i++) {    for($j = 0; $j < $len-$i; $j++) {      if($arr[$j] > $arr[$j+1]) {        $tmp = $arr[$j+1];        $arr[$j+1] = $arr[$j];        $arr[$j] = $tmp;      }    }  }  return $arr;}

3、簡(jiǎn)單選擇排序

/*  簡(jiǎn)單選擇排序, 簡(jiǎn)單排序思想:從數(shù)組第一個(gè)元素開始依次確定從小到大的元素*/function selectSort($arr) {  $len = count($arr);  for($i = 0; $i < $len; $i++) {    $k = $i;    for($j = $i+1; $j < $len; $j++) {      if($arr[$k] > $arr[$j]) {        $k = $j;      }    }    if($k != $i) {      $tmp = $arr[$i];      $arr[$i] = $arr[$k];      $arr[$k] = $tmp;    }  }  return $arr;}

4、希爾排序

/*  希爾排序,希爾排序原理:將數(shù)組按指定步長(zhǎng)分隔成若干子序列,然后分別對(duì)子序列進(jìn)行排序(在這是直接)*/function shellSort($arr) {  $len = count($arr);  $k = floor($len/2);  while($k > 0) {    for($i = 0; $i < $k; $i++) {      for($j = $i; $j < $len, ($j + $k) < $len; $j = $j + $k) {        if($arr[$j] > $arr[$j+$k]) {          $tmp = $arr[$j+$k];          $arr[$j+$k] = $arr[$j];          $arr[$j] = $tmp;        }      }    }    $k = floor($k/2);  }  return $arr;}

5、快速排序

/* *  快速排序,快排思想:通過一趟排序?qū)⒋诺挠涗浄譃閮蓚€(gè)獨(dú)立的部分,其中一部分的記錄的關(guān)鍵字均不大于 *  另一部分記錄的關(guān)鍵字,然后再分別對(duì)這兩部分記錄繼續(xù)進(jìn)行快速排序,以達(dá)到整個(gè)序列有序,具體做法需要 *  每趟排序設(shè)置一個(gè)標(biāo)準(zhǔn)關(guān)鍵字和分別指向頭一個(gè)記錄的關(guān)鍵字和最后一個(gè)記錄的關(guān)鍵字的指針。 *  quickSort($arr, 0, count($arr) -1); */function quickSort(&$arr,$low,$high) {  if($low < $high) {    $i = $low;    $j = $high;    $primary = $arr[$low];    while($i < $j) {      while($i < $j && $arr[$j] >= $primary) {        $j--;      }      if($i < $j) {        $arr[$i++] = $arr[$j];      }      while($i < $j && $arr[$i] <= $primary) {        $i++;      }      if($i < $j) {        $arr[$j--] = $arr[$i];      }    }    $arr[$i] = $primary;    quickSort($arr, $low, $i-1);    quickSort($arr, $i+1, $high);  }}

6、堆排序

/*  堆排序*/// 調(diào)整子堆的為大根堆的過程,$s為子堆的根的位置,$m為堆最后一個(gè)元素位置function heapAdjust(&$arr, $s, $m) {  $tmp = $arr[$s];  // 在調(diào)整為大根堆的過程中可能會(huì)影響左子堆或右子堆  // for循環(huán)的作用是要保證子堆也是大根堆  for($j = 2*$s + 1; $j <= $m; $j = 2*$j + 1) {    // 找到根節(jié)點(diǎn)的左右孩子中的最大者,然后用這個(gè)最大者與根節(jié)點(diǎn)比較,    // 若大則進(jìn)行調(diào)整,否則符合大根堆的 特點(diǎn)跳出循環(huán)      if($j < $m && $arr[$j] < $arr[$j+1]) {      $j++;    }    if($tmp >= $arr[$j] ) {      break;    }    $arr[$s] = $arr[$j];    $s = $j;  }  $arr[$s] = $tmp;}// 堆排序function heapSort($arr) {  $len = count($arr);  // 依次從子堆開始調(diào)整堆為大根堆  for($i = floor($len/2-1); $i >= 0; $i--) {    heapAdjust($arr, $i, $len-1);  }  // 依次把根節(jié)點(diǎn)調(diào)換至最后一個(gè)位置,再次調(diào)整堆為大根堆,找到次最大值,  // 依次類推得到一個(gè)有序數(shù)組  for($n = $len-1; $n > 0; $n--) {    $tmp = $arr[$n];    $arr[$n] = $arr[0];    $arr[0] = $tmp;    heapAdjust($arr, 0, $n-1);  }  return $arr;}

7、歸并排序

/*  歸并排序,這里實(shí)現(xiàn)的是兩路歸并*/// 分別將有序的$arr1[s..m]、$arr2[m+1..n]歸并為有序的$arr2[s..n]function Merge(&$arr1, &$arr2, $s, $m, $n) {  for($k = $s,$i = $s, $j = $m+1; $i <= $m && $j <= $n; $k++) {    if($arr1[$i]<$arr1[$j]) {      $arr2[$k] = $arr1[$i++];    }else {      $arr2[$k] = $arr1[$j++];    }  }  if($i <= $m) {    for(; $i <= $m; $i++) {      $arr2[$k++] = $arr1[$i];    }  } else if($j <= $n) {    for(; $j <= $n; $j++) {      $arr2[$k++] = $arr1[$j];    }  }}// 遞歸形式的兩路歸并function MSort(&$arr1, &$arr2, $s, $t) {  if($s == $t) {    $arr2[$s] = $arr1[$s];  }else {    $m = floor(($s+$t)/2);    $tmp_arr = array();    MSort($arr1, $tmp_arr, $s, $m);    MSort($arr1, $tmp_arr, $m+1, $t);    Merge($tmp_arr, $arr2, $s, $m, $t);  }}// 對(duì)一位數(shù)組$arr[0..n-1]中的元素進(jìn)行兩路歸并function mergeSort($arr) {  $len = count($arr);  MSort($arr, $arr, 0, $len-1);  return $arr;}

使用經(jīng)驗(yàn)
若排序的記錄數(shù)目n較小時(shí),可以采用直接插入排序和簡(jiǎn)單選擇排序,當(dāng)記錄本身信息量較大時(shí),用簡(jiǎn)單選擇排序方法較好。
若待排序記錄按關(guān)鍵字基本有序,適合采用直接插入排序和冒泡排序。
若n值較大時(shí),可以采用快速排序、堆排序和歸并排序。另外快速排序被認(rèn)為是內(nèi)部排序方法中最好的方法。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲va久久久噜噜噜久牛牛影视 | 日韩欧美电影在线观看 | 在线看免费观看日本 | 91精品片| 日韩在线播放第一页 | 在线观看av国产一区二区 | 国产一级免费在线视频 | 久久久一二三 | 欧美激情视频一区二区免费 | 国产中出在线观看 | 亚洲激情91| 国产噜噜噜 | 免费视频a | 免费毛片在线 | 精品国产一区二区三区在线观看 | 激情欧美在线 | 最新在线黄色网址 | 黄色免费小视频网站 | 深夜免费观看视频 | 黄色一级片在线观看 | 欧美色另类 | 大学生a级毛片免费视频 | 羞羞视频免费观看网站 | 全黄性性激高免费视频 | 欧美精品18videos性欧美 | 免费在线观看一级片 | 日韩毛片毛片久久精品 | 黄网站免费在线看 | 国产精品久久久免费看 | 免费网址黄 | 中文字幕在线免费看 | 亚洲第五色综合网 | pornoⅹxxxxhd麻豆 | 2021国产精品| 亚洲成人激情av | 中文字幕在线观看精品 | 黄色片网站免费在线观看 | 成人性生活视频在线观看 | 高清视频91 | 91福利影视| 久久综合入口 |