1. 程式人生 > >java的排序算法

java的排序算法

lec 需要 分區 臨時變量 下一個 sys ava 節點和 system

簡單選擇排序:

package cn.mdj.test;

public class SelectSort {

public static void sort(int array[]){

int len = array.length;

int temp; //臨時變量

int index; //最小元素索引

for(int i=0;i<len;i++){

index = i;//假設第一個元素最小

for(int j=i+1;j<len;j++){//將當前的最小元素與後面元素比較,獲取最小的元素

if(array[j]<array[index]){

index = j;//交換索引,索引永遠指向最小的那個元素

}

}

//與後面元素遍歷完後,看是否需要進行交換

if(index != i){

temp = array[index];

array[index] = array[i];

array[i] = temp;

}

}

}

public static void main(String[] args) {

int[] array = new int[]{1,3,2,6,4,8,5,7,9};

sort(array);

for(int i=0;i<array.length;i++){

System.out.print(array[i]+"、");

}

}

}

簡單插入排序:

package cn.mdj.test;

public class InsertSort {

public static void sort(int[] array){

int len = array.length;

for(int i=1;i<len;i++){

int temp = array[i]; //保存要插入的元素

int j=0; //有序區,內首先有一個元素

//對有序區開始排序,從有序區的後面開始比較大小進行交換

for(j=i-1;j>-1&&temp < array[j];j--){

//如果待插入的元素比其小,則它前面的元素要後移

array[j+1] = array[j];

}

//直到,temp比前面的元素大,即停止,此時的j即該元素的位置,但因j--,所以位置還有要回填1

array[j+1]=temp;

}

}

public static void main(String[] args) {

int[] array = new int[]{1,3,2,6,4,8,5,7,9};

sort(array);

for(int i=0;i<array.length;i++){

System.out.print(array[i]+"、");

}

}

}

簡單冒泡排序:

package cn.mdj.test;

public class BubbleSort {

public static void sort(int[] array){

int len = array.length;

for(int i=0;i<len;i++){

for(int j=i+1;j<len;j++){

if(array[i]>array[j]){

int temp = array[i];

array[i]=array[j];

array[j]= temp;

}

}}}

堆排序:

public class HeapSort {

public static void sort(int[] array){

int len = array.length;

//建立大頂堆

buildMaxHeap(array,len);

for(int i=len-1;i>0;i--){

int temp = array[i];

array[i] = array[0];

array[0] = temp;

MaxHeapify(array,1,i);

}

}

public static void buildMaxHeap(int[] arr,int len){

//從中間元素開始,調整使其變成大頂堆

for(int i=len/2;i>0;i--){

MaxHeapify(arr,i,len);

}

}

public static void MaxHeapify(int[] arr,int index,int len){

int left = 2*index; //當前索引的左孩子

int right = left+1; //當前索引的右孩子

int lagest; //用於儲存最大索引

//如果左葉子節點索引小於堆大小,比較當前值和左葉子節點的值,取值大的索引值

if(left <= len&&arr[left-1]>arr[index-1]){

lagest = left;

}else{

lagest = index;

}

//如果右葉子節點索引小於堆大小,比較右葉子節點和之前比較得出的較大值,取大的索引值

if(right<=len&&arr[right-1]>arr[lagest-1]){

lagest = right;

}

//交換位置,並繼續遞歸調用該方法調整位置。

if(lagest != index){

int temp = arr[index-1];

arr[index-1] = arr[lagest-1];

arr[lagest-1] = temp;

MaxHeapify(arr,lagest,len);

}

}

public static void main(String[] args) {

int[] array = new int[]{1,3,2,6,4,8,5,7,9};

sort(array);

for(int i=0;i<array.length;i++){

System.out.print(array[i]+"、");

}

}

}

希爾排序:

package cn.mdj.test;

public class ShellSort {

public static void sort(int[] array){

int len = array.length;

int h = 1;

while(h<=len/3){ //當分區的區間沒有超過len數據的長度,即 繼續按照固定增量法,增加

h = h*3 + 1; //初始增量,最後得到h為劃分的合理區間

}

while(h>0){ //直到h=1;為止

for(int i=h;i<len;i++){ //和插入排序類似,從分區域的第二個元素開始,所以是i=h;;

//只所以是i++;是因為控制的是外面的,都要分區

int temp = array[i]; //保存第二個元素

int j = array[i-h];//有序區中的一個元素

//開始對有序區中的元素進行排序,從後往前,即從i-h,

for(j=i-h;j>-1&&temp<array[j];j=j-h){ //註意是j-h

//往後移動

array[j+h] = array[j];

}

array[j+h] = temp;

}

h = (h-1)/3; //不斷縮小區間,直到為1

}

}

public static void main(String[] args) {

int[] array = new int[]{1,3,2,6,4,8,5,7,9};

sort(array);

for(int i=0;i<array.length;i++){

System.out.print(array[i]+"、");

}

}

}

快速排序:

package cn.mdj.test;

public class QuickSort {

public static void sort(int[] array){

int len = array.length;

quickSort(array,0,len-1);

}

public static void quickSort(int arr[],int l,int r){

//l 左 r 右

int left = l;

int right = r;

int jizhunzhi = arr[left];

while(left < right){ //左 沒有超過 右的時候

while(left<right&&jizhunzhi<arr[right]){

right--;

}

if(left<right){ //否則當 jizhunzhi>arr[right] 時候,說明要開始交換了

arr[left] = arr[right];

left++;//開始移動到下一個位置

}

//同樣,右邊完成後,左邊要開始了

while(left<right&&jizhunzhi>arr[left]){

left++;

}

if(left<right){//否則 jizhunzhi<arr[left]

arr[right] = arr[left];

right--;

}

}

//最後直到left = right 停止,那麽第一元素,也就是我們假設的jizhunzhi的位置也就確定好了

arr[left] = jizhunzhi;

if(l<left) quickSort(arr,l,right-1);

if(left<r) quickSort(arr,right+1,r);

}

public static void main(String[] args) {

int[] array = new int[]{1,13,2,6,4,8,5,7,9};

sort(array);

for(int i=0;i<array.length;i++){

System.out.print(array[i]+"、");

}

}

}

java的排序算法