1. 程式人生 > >八大排序演算法JAVA實現(時間複雜度O(n-n)篇)

八大排序演算法JAVA實現(時間複雜度O(n-n)篇)

本文主要描述3個時間複雜度為n2的排序演算法:氣泡排序、選擇排序、插入排序。

1.氣泡排序:由陣列頭部開始,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。每次交換完成後,當前陣列最大值就會被放在最後。

 1     public int[] bubbleSort(int[] a, int n)
 2     {
 3         for (int j = 0; j < n - 2; j++)
 4         {
 5             for (int i = 0; i < n - j - 1; i++)
 6             {// 如果當前數比下一個大,交換,否則繼續看下一個數
7 if (a[i] > a[i + 1]) 8 { 9 int temp = a[i + 1]; 10 a[i + 1] = a[i]; 11 a[i] = temp; 12 } 13 } 14 } 15 return a; 16 } 17

傳入引數:a為待排序陣列,n為陣列長度。

第一個for迴圈,用j的值控制第二個迴圈,即比對陣列的長度。由氣泡排序的定義可知,每一次都會將最大值放在最後,所以下一次排的時候就可以少管一個數;

第二個for迴圈,將兩個數比對,大的放在後面。

本題第一個for迴圈是一種小小的優化,可以不使用,直接對整個陣列進行交換也是沒有問題的。

2.選擇排序:每次在陣列中選擇最小的一個數,將其依次放在陣列頭對應位置。

 1     public int[] selectionSort(int[] a, int n)
 2     {
 3         for (int j = 0; j < n - 1; j++)
 4         {//j表示需要在以j開始的數組裡面尋找一個最大值填充j位
 5             int maxi = 0;
 6             for (int
i = 0; i < n - j; i++) 7 {// maxi表示當前序列最大值的下標 8 if (a[maxi] < a[i]) 9 { 10 maxi = i; 11 } 12 } 13 if (maxi != n - j - 1) 14 { 15 int temp = a[n - j - 1]; 16 a[n - j - 1] = a[maxi]; 17 a[maxi] = temp; 18 } 19 } 20 return a; 21 }

3.插入排序:將其模擬為往一個有序陣列中插入一個值。關鍵在於需要把有序陣列比當前數大的數字一個個往後移動。

 1     public int[] insertionSort(int[] a, int n)
 2     {
 3         for (int i = 1; i < n; i++)
 4         {//認為a[0]只有一個數,是有序的。所以從第二個數開始插入
 5             int nowNum = a[i];
 6             int j = i - 1;
 7             for (; j >= 0; j--)
 8             {//把所有比插入數大的數字往後挪,迴圈結束後就會留出一個空位
 9                 if (nowNum < a[j])
10                 {
11                     a[j + 1] = a[j];
12                 }
13                 else
14                 {
15                     break;
16                 }
17             }
18             a[++j] = nowNum;
19         }
20         return a;
21     }

相關推薦

八大排序演算法JAVA實現時間複雜O(n-logn)

本文講述時間複雜度為n*logn的排序演算法:歸併排序、快速排序、堆排序以及希爾排序的原理、Java實現以及變形應用。 一、歸併排序  原理:把兩個有序數列合併為一個有序數列。需遞迴實現。  Java實現: 1 public int[] mergeSort(in

八大排序演算法JAVA實現時間複雜O(n-n)

本文主要描述3個時間複雜度為n2的排序演算法:氣泡排序、選擇排序、插入排序。 1.氣泡排序:由陣列頭部開始,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。每次交換完成後,當前陣列最大值就會被放在最後。 1 public int[] bubbleSort

C語言八大排序演算法(包括穩定性、時間複雜收藏)

C語言八大排序演算法 概述 排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。我們這裡說說八大排序就是內部排序。 當n較大,則應採用時間複雜度為O(nlog2n)的排序方法:快速排序、堆排

排序JAVA實現時間複雜分析

堆排序是一個比較常用的排序方式,下面是其JAVA的實現: 1. 建堆 // 對輸入的陣列進行建堆的操作 private static void buildMaxHeap(int[] array, int length) { // 遍歷所有

【資料結構與演算法-java實現】二 複雜分析:最好、最壞、平均、均攤時間複雜的概念

上一篇文章學習了:如何分析、統計演算法的執行效率和資源消耗? 點選連結檢視上一篇文章:複雜度分析上 今天的文章學習以下內容: 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度 1、最好與最壞情況時間複雜度 我們首先

連結串列排序演算法java實現連結串列的快速排序、插入排序、歸併排序

難易程度:★★ 重要性:★★★      連結串列的排序相對陣列的排序更為複雜些,也是考察求職者是否真正理解了排序演算法(而不是“死記硬背”) 連結串列的插入排序 public class LinkedInsertSort { static cla

基礎排序演算法 java 實現冒泡、選擇、插入、快排、歸併、堆排

package demo; import java.util.Arrays; public class SortUtil { private static void printArr(int[] arr) { System.out.println

有1,2...一直到n的無序陣列,求排序演算法,並且要求時間複雜On,時間複雜O1

提示:用陣列值作為下標 分析:        對於一般陣列的排序顯然 O(n) 是無法完成的。       既然題目這樣要求,肯定原先的陣列有一定的規律,讓人們去尋找一種機會。 例如:原始陣列:           a = [ 10, 6,9, 5,2

尋找主元素演算法時間複雜O(N),C#)

主元素問題:大小為N的陣列A,其主要元素是一個出現次數超過N/2的元素。 最近在學習演算法,書上發現這樣一道題,並且提供了一種遞迴演算法的概要,但是感覺不是特別好(遞迴判斷(時間複雜度大於O(N)了),還要對N的奇偶做出判斷以及使用附加陣列B),網上看了一下有一個SEO排行最靠前的(不說名字了,

常見排序演算法及對應的時間複雜和空間複雜

轉載請註明出處: 排序演算法經過了很長時間的演變,產生了很多種不同的方法。對於初學者來說,對它們進行整理便於理解記憶顯得很重要。每種演算法都有它特定的使用場合,很難通用。因此,我們很有必要對所有常見的排序演算法進行歸納。 排序大的分類可以分為兩種:內

java:兩個升序陣列的二元歸併,時間複雜O(m+n)

方法1:(利用陣列作為容器):     特點:         1/結果為陣列,合併後依然可以通過下標快速訪問;         2/需要考慮重複元素導致的合併後結果陣列實際長度變短問題;

Morris遍歷詳解——二叉樹先序中序後序遍歷 時間複雜O(N),空間複雜O(1)

Morris二叉樹遍歷: 來到當前的節點:Cur 如果Cur無左孩子,Cur向右移動 (Cur = Cur.right) 如果Cur有左孩子,找到Cur左子樹上最右的節點,記為 mostright

1134 最長遞增子序列時間複雜O(n*log(n)

基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 Description 給出長度為N的陣列,找出這個陣列的最長遞增子序列。(遞增子序列是指,子序列的元素是遞增的) 例如:5 1 6 8 2 4 5 10,最長遞增

[收藏]時間複雜 O(log n) 意味著什麼?

原文地址:https://github.com/xitu/gold-miner/blob/master/TODO/what-does-the-time-complexity-o-log-n-actually-mean.md 原文作者:Maaz 譯文出自:掘金翻譯計劃 譯者:c

快速排序演算法詳解原理、實現時間複雜

快速排序是對氣泡排序的一種改進,由 C.A.R.Hoare(Charles Antony Richard Hoare,東尼·霍爾)在 1962 年提出。 快速排序的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料比另一部分的所有資料要小,再按這種方法對這兩部分資料分別進行快速排

常見排序演算法的基本原理、程式碼實現時間複雜分析

  排序演算法無論是在實際應用還是在工作面試中,都扮演著十分重要的角色。最近剛好在學習演算法導論,所以在這裡對常見的一些排序演算法的基本原理、程式碼實現和時間複雜度分析做一些總結 ,也算是對自己知識的鞏固。 說明: 1.本文所有的結果均按照非降序排列; 2.本文所有的程式均用c++實現,

二分查詢折半查詢演算法原理、實現時間複雜

查詢也是有特殊情況的,比如數列本身是有序的。這個有序數列是怎麼產生的呢?有時它可能本身就是有序的,也有可能是我們通過之前所學的排序演算法得到的。 不管怎麼說,我們現在已經得到了有序數列了並需要查詢。這時二分查詢該出場了。 二分查詢(Binary Search)也叫作折半查詢。二分查詢有兩個要求,一個是數列

分塊查詢演算法完全攻略原理、實現時間複雜

一般對於需要查詢的待查資料元素列表來說,如果很少變化或者幾乎不變,則我們完全可以通過排序把這個列表排好序以便我們以後查詢。但是對於經常增加資料元素的列表來說,要是每次增加資料都排序的話,那真的是有點太累人了。 所以之前我們分析過,對於幾乎不變的資料列表來說,排序之後使用二分查詢是很不錯的,但是對於經常變動的

順序查詢演算法原理、實現時間複雜

一提到查詢,比如從一個數列中查詢第1個值為k的數,那麼我們最先想到的肯定是一個一個地找。從數列的第 1 個數開始對比,直到找到值為k的數。 順序查詢的定義為:在一個已知無序(或有序)的佇列中找出與給定的關鍵字相同的數的具體位置。其原理是讓關鍵字與佇列中的數從開始一個一個地往後逐個比較,直到找到與給定的關鍵字

排序演算法——希爾排序的圖解、程式碼實現以及時間複雜分析

希爾排序(Shellsort) 希爾排序是衝破二次時間屏障的第一批演算法之一。 希爾排序通過比較相距一定間隔的元素來工作;各躺比較所用的距離隨著演算法的進行而減小,直到只比較相鄰元素的最後一趟排序為止。由於這個原因,希爾排序有時也叫做縮減增量排序。 希爾排