日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

排序算法有哪些?

發(fā)布時(shí)間:2025/5/22 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法有哪些? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、冒泡排序(Bubble Sort)
1.1 算法描述
·比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩個(gè);
·對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)·該會(huì)是最大的數(shù);
·針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè);
·重復(fù)步驟1~3,直到排序完成

function bubbleSort(arr) {var len = arr.length;for (var i = 0; i < len - 1; i++) {for (var j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j+1]) { // 相鄰元素兩兩對(duì)比var temp = arr[j+1]; // 元素交換arr[j+1] = arr[j];arr[j] = temp;}}}return arr; }

1.2總結(jié)
內(nèi)層循環(huán)每次結(jié)束后都能得到本輪最大的一個(gè)數(shù),外層循環(huán)控制要比較多少輪
它重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過(guò)來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端

2、選擇排序(Selection Sort)
工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

function selectionSort(arr) {var len = arr.length;var minIndex, temp;for (var i = 0; i < len - 1; i++) {minIndex = i;for (var j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) { // 尋找最小的數(shù)minIndex = j; // 將最小數(shù)的索引保存}}temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}return arr; }

3、插入排序(Insertion Sort)
3.1從第一個(gè)元素開始,該元素可以認(rèn)為已經(jīng)被排序;
3.2取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描;
3.3如果該元素(已排序)大于新元素,將該元素移到下一位置;
3.4重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置;
3.5將新元素插入到該位置后;
3.6重復(fù)步驟2~5。

function insertionSort(arr) {var len = arr.length;for (var i = 1; i < len; i++) {var j = i;var current = arr[i];while (j - 1>= 0 && current < arr[j - 1]) {arr[j] = arr[j - 1];j = j - 1;}arr[j] = current;}return arr; }

4、希爾排序(Shell Sort)
簡(jiǎn)單插入排序很循規(guī)蹈矩,不管數(shù)組分布是怎么樣的,依然一步一步的對(duì)元素進(jìn)行比較,移動(dòng),插入,比如[5,4,3,2,1,0]這種倒序序列,數(shù)組末端的0要回到首位置很是費(fèi)勁,比較和移動(dòng)元素均需n-1次。
希爾排序是簡(jiǎn)單插入排序的改進(jìn)版。它與插入排序的不同之處在于,它會(huì)優(yōu)先比較距離較遠(yuǎn)的元素。希爾排序又叫縮小增量排序。
希爾排序過(guò)程如下:


function shellSort(arr) {var len = arr.length;for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {for (var i = gap; i < len; i++) {var j = i;var current = arr[i];while (j - gap >= 0 && current < arr[j - gap]) {arr[j] = arr[j - gap];j = j - gap;}arr[j] = current;}}return arr; }

希爾排序的核心在于間隔序列的設(shè)定。既可以提前設(shè)定好間隔序列,也可以動(dòng)態(tài)的定義間隔序列。

5、歸并排序(Merge Sort)
歸并排序(MERGE-SORT)是利用歸并的思想實(shí)現(xiàn)的排序方法,該算法采用經(jīng)典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然后遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補(bǔ)"在一起,即分而治之)。將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為2-路歸并

package sortdemo;import java.util.Arrays;/*** Created by chengxiao on 2016/12/8.*/ public class MergeSort {public static void main(String []args){int []arr = {9,8,7,6,5,4,3,2,1};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int []arr){int []temp = new int[arr.length];//在排序前,先建好一個(gè)長(zhǎng)度等于原數(shù)組長(zhǎng)度的臨時(shí)數(shù)組,避免遞歸中頻繁開辟空間sort(arr,0,arr.length-1,temp);}private static void sort(int[] arr,int left,int right,int []temp){if(left<right){//先從小區(qū)域先排序再到大區(qū)域int mid = (left+right)/2;sort(arr,left,mid,temp);//左邊歸并排序,使得左子序列有序sort(arr,mid+1,right,temp);//右邊歸并排序,使得右子序列有序merge(arr,left,mid,right,temp);//將兩個(gè)有序子數(shù)組合并操作}}private static void merge(int[] arr,int left,int mid,int right,int[] temp){//left 是左子序列的開始,mid是它的結(jié)尾//mid+1是右子序列的開始,right是它的結(jié)尾int i = left;//左序列指針int j = mid+1;//右序列指針int t = 0;//臨時(shí)數(shù)組指針while (i<=mid && j<=right){if(arr[i]<=arr[j]){temp[t++] = arr[i++];}else {temp[t++] = arr[j++];}}while(i<=mid){//將左邊剩余元素填充進(jìn)temp中temp[t++] = arr[i++];}while(j<=right){//將右序列剩余元素填充進(jìn)temp中temp[t++] = arr[j++];}t = 0;//將temp中的元素全部拷貝到原數(shù)組中while(left <= right){arr[left++] = temp[t++];}} }

6、快速排序(Quick Sort)
從數(shù)列中挑出一個(gè)元素,稱為 “基準(zhǔn)”(pivot);
重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作;
遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

public class QuickSort implements IArraySort {@Overridepublic int[] sort(int[] sourceArray) throws Exception {// 對(duì) arr 進(jìn)行拷貝,不改變參數(shù)內(nèi)容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);return quickSort(arr, 0, arr.length - 1);}private int[] quickSort(int[] arr, int left, int right) {if (left < right) {//先從大區(qū)域先排序再到小區(qū)域int partitionIndex = partition(arr, left, right);quickSort(arr, left, partitionIndex - 1);quickSort(arr, partitionIndex + 1, right);}return arr;}private int partition(int[] arr, int left, int right) {// 設(shè)定基準(zhǔn)值(pivot)int pivot = left;int index = pivot + 1;//index代表的就是比基準(zhǔn)值大的那些數(shù)的下標(biāo)最小值//可以把index認(rèn)為就是大于基準(zhǔn)值的數(shù)的下標(biāo),index前面的都是比基準(zhǔn)值小的for (int i = index; i <= right; i++) {if (arr[i] < arr[pivot]) {swap(arr, i, index);index++;}}swap(arr, pivot, index - 1);return index - 1;}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}

總結(jié)

以上是生活随笔為你收集整理的排序算法有哪些?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。