快速排序快速入門
快速排序
快速排序的基本思想:
1.選一個數作為基準數(一般選取區間的第1個數)
2.把所有比這個大的數放到右邊,所有比這個數小的數放到左邊
3.以基準數為分界線,分為左右兩個區間,重複1和2過程,直到區間的個數只有一個
下面我們就用例項來說明:
我們需要有三個引數,i是區間的開始,j是區間的結束,temp是基準數
第一步:i=0,j=7,temp=12
第二步:j往前找,找到第一個比temp小的數就停下來,並且和i的值進行交換
在這裡找到比temp小的第一個數就是a[ 5],此時i=0,j=5,temp=12
進行交換
第三步:i往後找,找到第一個比temp大的數就停下來,並且和j的值進行交換
在這裡找到比temp大的第一個數就是a[ 3],此時i=3,j=5,temp=12
進行交換
第四步:j繼續往前找,一直找到i=j都沒有找到比temp小的數,則停止尋找,第一輪比較結束。此時,所有比temp小的數都在左邊,比temp大的數都在右邊了。此時,i=j=3,temp=12。
第五步:以3這個索引為分界線,分為[0,2]和[4,7]兩個區間,並且一直重複上述步驟,直到子區間只有一個數,不能在分割,下面不再詳細說步驟了。
下面就是快速排序的java程式碼:
public class FastAlgorithm {
public void sort(int[] arr,int start,int end) {
//標記第一個位置
int i = start;
//標記最後一個的位置
int j = end;
//標記基準數
int first = arr[start];
while(i<j) {
//j從右往左遞減,和first作比較
while(j>i && arr[j]>first) {
j--;
}
//找到第一個比first小的,交換兩個數
if(arr[j]<=first) {
swap(arr,i,j);
i++;
}
//從左往右遞增,和first比較
while(i<j && arr[i]<first) {
i++;
}
//找到第一個比first大的,交換兩個數
if(arr[i]>=first) {
swap(arr,i,j);
j--;
}
}
//i=j時,跳出迴圈
//遞迴
//如果左區間個數不小於一,則遞迴下去
if(i>start)
sort(arr,start,i-1);
//如果右區間個數不小於一,則遞迴下去
if(j<end)
sort(arr,j+1,end);
}
/**
* 交換陣列中的兩個元素
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr,int i,int j) {
int k;
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
相關文章
- SQL快速入門 ( MySQL快速入門, MySQL參考, MySQL快速回顧 )MySql
- 自學前端如何快速入門?怎麼快速入門前端?前端
- MySQL 快速入門MySql
- mysqlsla快速入門MySql
- Pipenv 快速入門
- Envoy 快速入門
- mongodb快速入門MongoDB
- Spark 快速入門Spark
- zookeeper 快速入門
- MQTT 快速入門MQQT
- Lumen快速入門
- Webpack快速入門Web
- RabbitMQ快速入門MQ
- QT快速入門QT
- makefile快速入門
- CSS快速入門CSS
- Markdown快速入門
- Docker快速入門Docker
- mybatis快速入門MyBatis
- Nginx快速入門Nginx
- TypeScript快速入門TypeScript
- TypeScript 快速入門TypeScript
- phpunit 快速入門PHP
- Zookeeper快速入門
- pipenv快速入門
- Thymeleaf【快速入門】
- WebSocket 快速入門Web
- React快速入門React
- vim快速入門
- JavaScript快速入門JavaScript
- 快速入門reactReact
- Express快速入門Express
- GitHub 快速入門Github
- Vue快速入門Vue
- Allure快速入門
- SprinMvc快速入門MVC
- Postman快速入門Postman
- Promise快速入門Promise