演算法系列 排序演算法(四)快速排序

2021-08-23 14:29:09 字數 1845 閱讀 4593

快速排序是通過兩個指標相互交換完成一次快速排序,類似於遞迴的二分排序,從交換上來講比較像冒泡(為什麼這麼說呢?不管是插入還是直接,都需要在移動之前遍歷元素;冒泡直接比較交換。)

**(公升序):資料

4251

376下標

0123

4561)指標1:- 4 ; 指標2:- 6 ;指標1是用來二分的標準,指標2是被二分的元素,過程如下;資料4

2513

76下標0

1234

56當指標2走到陣列下標是4的時候判斷當前資料不符合排列順序,交換兩個指標的資料;然後指標1開始作為移動指標向右移動;資料3

2514

76下標0

1234

562)指標1:- 3 ; 指標2:- 4 ;兩個指標在這個過程中是乙個相互靠近的過程,不斷交換不符合順序的資料; 資料

3251

476下標

0123

456當指標1走到下標2時判斷當前資料不符合排列順序,交換兩個指標的資料;然後指標2開始作為移動指標向左移動;資料3

2415

76下標0

1234

563)指標1:- 4 ; 指標2:- 5 ;當兩個指標相等的時候,結束當前的二分過程;資料3

2145

76下標0

1234

56以上為乙個二分過程,然後形成的兩個區域的值,同樣重複二分操作,直到區間長度為1;

時間複雜度:在二分查詢的基礎上每層都會有一次當前範圍的遍歷所以時間複雜度 n*logn (logn 是以2為底n的對數) 

**實現:

/**

* fastsort 公升序

* * @date 2018/8/19

* @author joker

**/public class fastsorttest

/*** dfs 深度遍歷(遞迴)

*/@test

public void recursivetest()

/*** bfs 廣度遍歷(非遞迴)

*/@test

public void nonrecursivetest()

}linkedlistlist = new linkedlist<>();

list.add(new node(0, data.length - 1));

while (!list.isempty()) else

flag ^= true;

continue;

}if (!flag) else

}if (start < node.start - 1)

if (end > node.end + 1)

}system.out.println("排序結果:");

system.out.println(new gson().tojson(data));

}private void recursive(int data, int start, int end) else

flag ^= true;

continue;

}if (!flag) else

}if (range_s < start - 1)

if (range_e > end + 1)

}private int initdata(int length, int maxrange) );

system.out.println("初始化:");

system.out.println(new gson().tojson(data));

return data;

}}

演算法 排序(四)快速排序

快速排序 對氣泡排序的一種改進 1 時間複雜度o nlogn o n2 2 空間複雜度o logn o n 排序排序需要棧空間實現遞迴 3 不穩定的 4 快速排序的思想 帶排序列經過一次快排劃分,可以得到 子串行5 遞迴實現void qsort int l,int low,int high 用if ...

PHP 排序演算法(四) 快速排序

快速排序 思路 我們首先要找到乙個基準,陣列的前半部分是比基準小的元素,陣列後半部分是比基準大的元素,這裡我就拿陣列第乙個元素作為基準 設定隊首和隊尾兩個指標 隊尾指標先進行活動,一直向隊首移動,直到找到比基準值小的元素,然後將這個值賦給隊首指標處 下面隊首指標開始活動,一直向隊尾移動,直到找到比基...

常用演算法總結之排序(四) 快速排序

快速排序是對氣泡排序的一種改進。使用分治的策略進行排序。基本思想 通過一遍排序將待排序資料劃分為兩部分,使其中一部分比另一部分小,然後分別對兩部分資料繼續進行快速排序,直至每部分為空或只包含乙個資料。通過快速排序思想的描述可以很明顯的看出快速排序是一種採用遞迴排序的方法。具體排序過程 通過分治策略將...