Java陣列的高階部分:氣泡排序+選擇排序+直接插入排序+快速排序+折半查詢
1.氣泡排序
(1)氣泡排序的思想
兩兩比較,大的往後放,第一次比較完畢之後,最大值就出現在了最大索引處!然後依次這樣比較,就可以得到一個排好序的陣列.
(2)氣泡排序的規律
1)一定是兩兩比較,大的往後放,第一次比較完畢,最大值在最大索引處
2)第一次全部都比較,確定陣列的最大值
第一次比較,有0個元素不比
第二次比較,有1個元素不比
第三次比較,有2個元素不比
......
元素比較的次數:(陣列長度-1)次
(3)氣泡排序演算法
public static void BubbleSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for (int y = 0; y < arr.length - 1 - x; y++) { if (arr[y] > arr[y + 1]) { int temp = arr[y]; arr[y] = arr[y + 1]; arr[y + 1] = temp; } } } }
2.選擇排序
(1)選擇排序的思想
從0索引對應的元素依次和後面索引對應的元素進行比較,小的往前放,第一次比較完畢之後,最小值就出現在最小索引處,然後依次這樣比較,就可以得到一個排好序的陣列.
(2)選擇排序的規律
1)從0索引開始依次和後面索引對應的元素進行比較,小的資料往前放,最小值在最小索引處.
2)用0索引對應的值依次和後面索引對應的值比較
用1索引對應的值依次和後面索引對應的值比較
......
arr.length-2索引對應的元素和arr.length-1索引對應的值比較
(3)選擇排序演算法
// 選擇排序的功能 public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for (int y = x + 1; y < arr.length; y++) { if (arr[x] > arr[y]) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } }
3.直接插入排序
(1)直接插入排序的思想
直接插入排序,是一種最簡單的排序方法.他的基本操作是將一個記錄插入到一個長度為m 的有序表中,使之仍保持有序,從而得到一個新的長度為m+1的有序列表.假設有一組元素{k1,k2...,kn},排序開始就認為k1是一個有序序列,讓k2插入上述表長為1的有序序列,使之成為一個表長為2的有序序列,然後讓k3插入上述表長為2的有序序列,使之成為一個表長為3的有序序列,以此類推,最後讓kn插入表長為n-1的有序序列,得到一個表長為n的有序序列.
(2)舉例
•49,38,65,97,76,13,27 原始資料
[49],38,65,97,76,13,27
[38,49], ,65,97,76,13,27
[38,49,65] 97,76,13,27
[38,49,65,97] 76,13,27
[38,49,65,76,97]13,27
[13,27,38,49,65,76,97],27
[13,27,38,49,65,76,97]
(3)直接插入排序演算法
private static void insertSort(int[] arr) {
//外層迴圈 是迴圈的輪次
for (int i = 1; i <= arr.length - 1; i++) {
//當前元素,如果小於我前面的元素,交換位置
int j = i;
while (j > 0 && arr[j] < arr[j - 1]) {
int t = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = t;
j--;
}
}
}
4.快速排序
(1)快速排序的基本思想
•分治法:比大小,再分割槽
1.從陣列中取出一個數,作為基準數。
2.分區:將比這個數大或等於的數全放到他的右邊,小於他的數 全放到他的左邊。
3.再對左右區間重複第二步,直到各區間只有一個數。
(2)實現思路
•挖坑填數
1.將基準數挖出形成第一個坑。
2.由後向前找比他小的數,找到後挖出此數填到前一個坑中。
3.由前向後找比他大或等於的數,找到後也挖出此數填到前一個坑中。
4.再重複執行2,3兩步驟。
例如對 5391672408 進行排序
(3)快速排序演算法
public class QuickSort {
//start 預設是0
//end 是陣列長度-1
public void quickSort(int[] arr, int start, int end) {
if (start < end) {
//獲取分割槽索引
int index = getIndex(arr, start, end);
//對左右兩個分割槽 再進行同樣的步驟 ,即是遞迴呼叫
quickSort(arr, start, index - 1);//左半部分
quickSort(arr, index + 1, end);//右半部分
}
}
private int getIndex(int[] arr, int start, int end) {
int i = start;
int j = end;
//定義基準數
int x = arr[i];
//迴圈
while (i < j) {
//從右往左比較
while (i < j && arr[j] >= x) {
j--;
}
//從右往左找到比基準數小的數了後,填坑
if (i < j) {
//把這個數填到上一個坑位
arr[i] = arr[j];
//讓 i++;
i++;
}
//從左往右找
while (i < j && arr[i] < x) {
i++;
}
// 找比基準數大的數,找到後填坑
if (i < j) {
arr[j] = arr[i];
j--;
}
}
//當上面的迴圈結束後把基準數填到最後一個坑位,也就一基準數為界,分成了左右兩部分
arr[i] = x; //把基準數填進去
return i; //返回基準數所在位置的索引
}
}
5.折半查詢
(1)前提:一定是陣列中的元素有序的!
(2)折半查詢的中心思想:
直接將陣列元素減半,方便開發者使用,計算出中心索引,大了左邊找,小了右邊找.
(3)核心思想:
A:定義最小索引和最大索引
B:計算中間索引
C:中間索引對應的元素和需要查詢的元素比較
相等,直接返回中間索引
不相等:
大了,左邊找 max = mid -1 ;
小了,右邊找 min = mid + 1 ;
D:重新計算中間索引 ,回到B繼續查詢
(4)折半查詢演算法
public static int search(int[] arr,int value) {
//1)定義陣列中的最小索引和最大索引
int min = 0 ;
int max = arr.length -1 ;
//2) 計算出中間索引
int mid = (max+min)/2 ;
//3)拿中間索引對應的元素和需要查詢的元素進行比較
//如果相等,返回
while(arr[mid]!=value) {
//不相等
if(arr[mid] >value) {
max = mid -1 ;
}else {
min = mid + 1 ;
}
//如果這value在陣列中找不到,找不到返回-1
if(min>max) {
return -1 ;
}
//重新計算出中間索引
mid = (max+min)/2 ;
}
return mid ;
}
相關推薦
排序演算法(選擇、希爾、二分插入、冒泡、直接插入、快速排序)
public class BinarySearch1 { public static void main(String args[]) { int array[]={49,38,65,97,76,13,27}; binarySort(arra
Java陣列的高階部分:氣泡排序+選擇排序+直接插入排序+快速排序+折半查詢
1.氣泡排序 (1)氣泡排序的思想 兩兩比較,大的往後放,第一次比較完畢之後,最大值就出現在了最大索引處!然後依次這樣比較,就可以得到一個排好序的陣列. (2)氣泡排序的規律 1)一定是兩兩比較,大的往後放,第一次比較完畢,最大值在最大索引處 2)第
Java中常見的陣列排序演算法(包括冒泡,選擇,插入,快速排序)
1 public static void bubbleSort(int[] arr) { 2 3 for(int x=0; x<arr.length-1; x++) { 4 5 for(int y=0; y<arr.length-x-
排序演算法(直接插入、氣泡排序、選擇排序、快速排序、希爾排序、堆排序、歸併排序)
main函式 int main() { int data[] = {1,2,6,3,4,7,7,9,8,5}; //bubble_sort(data,10); //select_sort(data,10); Insert_Sort(data,10); fo
Python三種排序演算法的執行速度對比(快速排序、氣泡排序、選擇排序)
最近看了一下快速排序演算法,據說速度比其他的排序演算法快,於是寫了三個排序演算法對比一下,分別是氣泡排序,快速排序,選擇排序,以下是三個排序演算法的程式碼: 氣泡排序 BubbleSort.py # -*- coding:utf8 -*- def Sort(list
java基礎-四種排序:選擇/冒泡/直接插入/shell
import java.util.Arrays; /** * @Created with IntelliJ IDEA * @Description: 四種排序 * @Package: PACKAGE_NAME * @User: FLy * @Date: 2018/11/21
python排序(冒泡、直接選擇、直接插入等)
時間 lec 改進 部分 urn 最後一個元素 穩定 等於 style 冒泡排序 冒泡法:第一趟:相鄰的兩數相比,大的往下沈。最後一個元素是最大的。 第二趟:相鄰的兩數相比,大的往下沈。最後一個元素不用比。 1 #冒泡排序 2 arra
(排序演算法)linux c語言實現快速排序(氣泡排序的改進版)
快速排序演算法是對氣泡排序演算法的一種改進,氣泡排序是對單個元素的升降,快速排序是對所有元素的升降,不過這個升降是取了某一個標準的前提下,在本文程式碼中,就以a[i],其實就是以最左邊的元素為參考,比較交換之後,將這個參考元素放到分界的地方,即i的位置。 程式碼如下,裡面有比較詳細的
php四種基礎演算法:冒泡,選擇,插入和快速排序法 程式碼練習
function maopao($arr,$len) { for($i=1;$i<$len;$i++) { for($j=0;$j<$len-$i;$j++) { if($arr[$j]>$arr[$j+1])
排序算法整理:冒泡排序、堆排序、插入排序、歸並操作、快速排序、希爾排序、選擇排序
不用 else if select 依次 r++ 一個 關系 break 不能 SortUtils.java package prms.utils.sort; import java.util.Arrays; /** * @ClassName: SortU
(資料結構排序的實驗四)快速,冒泡,簡單選擇,直接插入排序的c語言實現!!
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18p
找出陣列中第K個最小的數(快速排序)
問題描述:給定一個無序的陣列,從一個數組中找出第K個最小的數,例如,對於給定陣列序列{1,5,2,6,8,0,6},其中第4小的數為5。 演算法思路:採用快速排序,分而治之的思想,根據主元,每次Partiton以主元為軸,比它小的數在左邊,比它大的數在右邊,判
排序演算法之直接插入排序的思想以及Java實現
1,基本思想 假設待排序的資料是陣列A[1….n]。初始時,A[1]自成1個有序區,無序區為A[2….n]。在排序的過程中,依次將A[i] (i=2,3,….,n)從後往前插入到前面已排好序的子陣列A
Python實現冒泡、選擇、插入、快速排序
ble style lec election 實現 class code quick i+1 1. 冒泡排序 # 冒泡排序 # 需比較len(seq)-1輪。每輪在下標0到len(seq)-i-1的數中,每一個數與它後面一個數比較,大數後移(冒泡),每輪中最大的數冒
java實現排序演算法之直接插入排序
直接插入排序思想將待排序陣列看成兩部分,一部分為已排好序,一部分為待排序,初始時已排序部分只有第一個元素。每次需將帶排序部分的第一個元素A(將該元素儲存在臨時變數中)與已排序的元素由後往前一一比較,如果元素A小於比較的元素B,則元素B後移一位,如果碰到元素A小於元素B則將元素
Go語言冒泡、選擇、插入、快速排序實戰淺析
Hello,各位小夥伴大家好,我是小棧君,今天為大家帶來的分享是關於go語言中的排序實戰淺析。 我們就實際操作關於go的氣泡排序、選擇排序、插入排序和快速排序四種方式的理論和實戰進行分享,希望能夠為大家在學習的路上帶來點啟發和經驗。 排序在我們平時的程式設計工作中時常可以見到,以按照不同的規則進行排序返回,以
排序算法<三>快速排序
排序算法 %d while cnblogs 快速 ace spa 算法 for #include<iostream> #include<cstdio> using namespace std; void swap(int arr[], int i,
C數據結構排序算法——直接插入排序法用法總結(轉http://blog.csdn.net/lg1259156776/)
所有 可能 app 必須 操作 itl 直接排序 works 技術分享 聲明:引用請註明出處http://blog.csdn.net/lg1259156776/ 排序相關的的基本概念 排序:將一組雜亂無章的數據按一定的規律順次排列起來。 數據表( data list)
排序算法-直接插入排序
log false clas ins class gen stat lin nbsp using System; using System.Collections.Generic; using System.Linq; using System.Text
數據結構(四十四)插入排序(1.直接插入排序 2.希爾排序)
結束 縮小 移動 個數 數據 空間 分析 過程 只有一個 一、插入排序的基本思想 從初始有序的子集合開始,不斷地把新的數據元素插入到已排列有序子集合的合適位置上,使子集合中數據元素的個數不斷增多,當子集合等於集合時,插入排序算法結束。常用的 插入排序算法有直接插入排