首頁 後端開發 php教程 PHP排序實現

PHP排序實現

Aug 08, 2016 am 09:30 AM
arr array count return

<?php
002
/**
003
 * 插入排序(一维数组)
004
 * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。
005
 */
006
function insertSort($arr) {
007
    if (!is_array($arr) || count($arr) == 0) {
008
        return $arr;
009
    }
010
    $count = count($arr);
011
    for ($i = 1; $i < $count; $i++) {
012
        if (isset($arr[$i])) {
013
            $tmp = $arr[$i]; //获取后一个元素的值
014
            $j = $i - 1; //获取前面的下标
015
            while ($arr[$j] > $tmp) { //如果前面一个比后面一个大, 这里是从小到大
016
                $arr[$j + 1] = $arr[$j]; //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个
017
                $arr[$j] = $tmp;
018
                $j--;
019
            }
020
        }
021
    }
022
    return $arr;
023
}
024
 
025
/**
026
 * 选择排序(一维数组)
027
 * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
028
 */
029
function selectSort($arr) {
030
    if (!is_array($arr) || count($arr) == 0) {
031
        return $arr;
032
    }
033
    $count = count($arr);
034
    for ($i = 0; $i < $count; $i++) {
035
        $k = $i;
036
        for ($j = $i + 1; $j < $count; $j++) {
037
            if ($arr[$k] > $arr[$j])
038
                $k = $j; //找出最小的
039
            if ($k != $i) {
040
                $tmp = $arr[$i];
041
                $arr[$i] = $arr[$k];
042
                $arr[$k] = $tmp;
043
            }
044
        }
045
    }
046
    return $arr;
047
}
048
 
049
/**
050
 * 冒泡排序(一维数组)
051
 * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止
052
 */
053
function bubbleSort($array) {
054
    $count = count($array);
055
    if ($count <= 0) {
056
        return false;
057
    }
058
    for ($i = 0; $i < $count; $i++) {
059
        for ($j = $count - 1; $j > $i; $j--) {
060
            if ($array[$j] < $array[$j - 1]) { //比较找到的数进行交换
061
                $tmp = $array[$j];
062
                $array[$j] = $array[$j - 1];
063
                $array[$j - 1] = $tmp;
064
            }
065
        }
066
    }
067
    return $array;
068
}
069
 
070
/**
071
 * 快速排序(一维数组)
072
 */
073
function quickSort($array) {
074
    if (count($array) <= 1) {
075
        return $array;
076
    }
077
    $key = $array[0];
078
    $left_arr = array();
079
    $right_arr = array();
080
    for ($i = 1; $i < count($array); $i++) {
081
        if ($array[$i] <= $key) {
082
            $left_arr[] = $array[$i];
083
        } else {
084
            $right_arr[] = $array[$i];
085
        }
086
    }
087
    $left_arr = quickSort($left_arr);
088
    $right_arr = quickSort($right_arr);
089
    return array_merge($left_arr, array(
090
            $key
091
    ), $right_arr);
092
}
093
 
094
/**
095
 * 按照元素的值进行排序
096
 * strOrder 为排列的顺序 asc 升序 desc 降序
097
 */
098
function sortByVal($arr, $strOrder = &#39;asc&#39;) {
099
    if (!is_array($arr) || count($arr) == 0) {
100
        return $arr;
101
    }
102
 
103
    $arrReturn = array();
104
    foreach ($arr as $key => $val) {
105
        $arrKey[] = $key;
106
        $arrVal[] = $val;
107
    }
108
 
109
    $count = count($arrVal);
110
    if ($count) {
111
        //创建key的顺序数组
112
        for ($key = 0; $key < $count; $key++) {
113
            $arrKeyMap[$key] = $key;
114
        }
115
        //对值进行排序
116
        for ($i = 0; $i < $count; $i++) {
117
 
118
            for ($j = $count - 1; $j > $i; $j--) {
119
                //<从小到大排列 升降在这修改
120
                $bol = $strOrder == &#39;asc&#39; ? $arrVal[$j] < $arrVal[$j - 1] : $arrVal[$j] > $arrVal[$j - 1];
121
                if ($bol) {
122
                    $tmp = $arrVal[$j];
123
                    $arrVal[$j] = $arrVal[$j - 1];
124
                    $arrVal[$j - 1] = $tmp;
125
                    //值的冒泡排序,引起key的数组的交互
126
                    $keytmp = $arrKeyMap[$j];
127
                    $arrKeyMap[$j] = $arrKeyMap[$j - 1];
128
                    $arrKeyMap[$j - 1] = $keytmp;
129
                }
130
            }
131
        }
132
        if (count($arrKeyMap)) {
133
            foreach ($arrKeyMap as $val) {
134
                $arrReturn[] = $arrKey[$val];
135
            }
136
        }
137
        return $arrReturn;
138
    }
139
}
140
 
141
/**
142
 * 使用原生的函数进行数组按照值进行排列
143
 */
144
function arraySortByVal($arr, $keys, $type = 'asc') {
145
    $keysvalue = $new_array = array();
146
    foreach ($arr as $k => $v) {
147
        $keysvalue[$k] = $v[$keys];
148
    }
149
    if ($type == 'asc') {
150
        asort($keysvalue);
151
    } else {
152
        arsort($keysvalue);
153
    }
154
    reset($keysvalue);
155
    foreach ($keysvalue as $k => $v) {
156
        $new_array[$k] = $arr[$k];
157
    }
158
    return $new_array;
159
}
登入後複製

j

以上就介紹了PHP排序實現,包含了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C語言return的用法詳解 C語言return的用法詳解 Oct 07, 2023 am 10:58 AM

C語言return的用法有:1、對於傳回值類型為void的函數,可以使用return語句來提前結束函數的執行;2、對於傳回值型別不為void的函數,return語句的作用是將函數的執行結果傳回給呼叫者;3、提前結束函數的執行,在函數內部,我們可以使用return語句來提前結束函數的執行,即使函數並沒有回傳值。

counta和count的區別 counta和count的區別 Nov 20, 2023 am 10:01 AM

Count函數用於計算指定範圍內數字的個數。它忽略文字、邏輯值和空值,但會將空白儲存格計算在內,Count函數只計算包含實際數字的儲存格數量。而CountA函數用於計算指定範圍內非空單元格的個數。它不僅計算包含實際數字的儲存格,還計算包含文字、邏輯值和公式等非空白儲存格的數量。

Java中return和finally語句的執行順序是怎樣的? Java中return和finally語句的執行順序是怎樣的? Apr 25, 2023 pm 07:55 PM

原始碼:publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}#輸出上述程式碼的輸出可以簡單地得出結論:return在finally之前執行,我們來看下字節碼層面上發生了什麼事情。下面截取case1方法的部分字節碼,並且對照源碼,將每個指令的含義註釋在

使用C#中的Array.Sort函數對陣列進行排序 使用C#中的Array.Sort函數對陣列進行排序 Nov 18, 2023 am 10:37 AM

標題:C#中使用Array.Sort函數對陣列進行排序的範例正文:在C#中,陣列是一種常用的資料結構,經常需要對陣列進行排序運算。 C#提供了Array類,其中有Sort方法可以方便地對陣列進行排序。本文將示範如何使用C#中的Array.Sort函數對陣列進行排序,並提供具體的程式碼範例。首先,我們要先了解Array.Sort函數的基本用法。 Array.So

如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組 如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組 Jun 26, 2023 pm 01:41 PM

在PHP中,有許多強大的陣列函數可以讓陣列的操作更加方便和快速。當我們需要將兩個陣列拼成一個關聯數組時,可以使用PHP的array_combine函數來實現這一操作。這個函數其實是用來將一個陣列的鍵當作另一個陣列的值,合併成一個新的關聯數組。接下來,我們將會講解如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組。了解array_comb

簡單明了的PHP array_merge_recursive()函式使用方法 簡單明了的PHP array_merge_recursive()函式使用方法 Jun 27, 2023 pm 01:48 PM

在進行PHP編程時,我們常常需要將數組合併。 PHP提供了array_merge()函數來完成數組合併的工作,但是當數組中存在相同的鍵時,函數會覆寫原來的值。為了解決這個問題,PHP在語言中還提供了一個array_merge_recursive()函數,該函數可以合併數組並保留相同鍵的值,使得程式的設計變得更加靈活。 array_merge

Vue3怎麼使用setup語法糖拒絕寫return Vue3怎麼使用setup語法糖拒絕寫return May 12, 2023 pm 06:34 PM

Vue3.2setup語法糖是在單文件組件(SFC)中使用組合式API的編譯時語法糖解決Vue3.0中setup需要繁瑣將聲明的變量、函數以及import引入的內容通過return向外暴露,才能在使用的問題1.在使用中無需return宣告的變數、函數以及import引入的內容,即可在使用語法糖//import引入的內容import{getToday}from'./utils'//變數constmsg='Hello !'//函數func

使用JavaScript中return關鍵字 使用JavaScript中return關鍵字 Feb 18, 2024 pm 12:45 PM

JavaScript中return的用法,需要具體程式碼範例在JavaScript中,return語句用來指定從函數傳回的值。它不僅可以用於結束函數的執行,還可以將一個值傳回給呼叫函數的地方。 return語句有以下幾個常見的用法:傳回一個值return語句可以用來傳回一個值給呼叫函數的地方。下面是一個簡單的範例:functionadd(a,b){

See all articles