android程式排序演算法實現

2021-06-16 15:07:55 字數 3760 閱讀 5939

eoe首期android達人訓練營開營啦!

【eoeandroid社群】維基百科翻譯第五期熱心網友招募[不限]

android getdecorview用途——螢幕截圖 ***

1.插入排序

插入排序是最簡單最直觀的排序演算法了,它的依據是:遍歷到第n個元素的時候前面的n-1個元素已經是排序好的了,那麼就查詢前面的n-1個元素把這第n個元素放在合適的位置,如此下去直到遍歷完序列的元素為止。

演算法的複雜度也是簡單的,排序第乙個需要1的複雜度,排序第二個需要2的複雜度,因此整個的複雜度就是

1 + 2 + 3 + …… + n = o(n ^ 2)的複雜度。

/*

*插入排序 */

void insertsort(int *arr,intn)

else

break;

} arr[j]=temp;//

將數放於合適位置

print(arr,n); }

}

2、shell排序

shell排序是對插入排序的乙個改裝,它每次排序把序列的元素按照某個增量分成幾個子串行,對這幾個子串行進行插入排序,然後不斷縮小增量擴大每個子串行的元素數量,直到增量為一的時候子串行就和原先的待排列序列一樣了,此時只需要做少量的比較和移動就可以完成對序列的排序了。

/*

*shell排序 */

void shellsort(int *arr,intn)

while(incre>=1&&tag); }

/*根據增量,使用插入排序調整順序 */

void shellsortwithincre(int *arr,int n,int

incre)

else

break;

} arr[j]=temp; }

}

3、氣泡排序

氣泡排序演算法的思想:很簡單,每次遍歷完序列都把最大(小)的元素放在最前面,然後再對剩下的序列從父前面的乙個過程,每次遍歷完之後待排序序列就少乙個元素,當待排序序列減小為只有乙個元素的時候排序就結束了。因此,複雜度在最壞的情況下是o(n ^ 2)

/*

*氣泡排序 */

void bubblesort(int *arr,intn)

}

if(!exchanged)

return;

} }

4、快速排序

快速排序的演算法思想: 選定乙個樞紐元素,對待排序序列進行分割,分割之後的序列乙個部分小於樞紐元素,乙個部分大於樞紐元素,再對這兩個分割好的子串行進行上述的過程。

/*

快速排序 */

void quicksort(int *arr,int start,int

end)

} /*根據pivot將陣列分為兩部分,左邊小於pivot,右邊大於pivot */

int partition(int *arr,int start,int

end)

arr[start]=pivotnum;

return

start; }

/*取頭,中,尾三數的中值 */

int getmediumnum(int *arr,int start,int

end)

else }

另乙個分割方法:

int partition(int *arr,int start,int

end)

} swap(arr[i+1],arr[end]);

return i+1; }

5、選擇排序

每次選擇最小的數,放入該數對應的位置。

/*

選擇排序 */

void selectsort(int *arr,intn)

if(min!=i)

std::swap(arr[i],arr[min]); }

}

6、堆排序

堆的定義:

n個關鍵字序列kl,k2,…,kn稱為堆,當且僅當該序列滿足如下性質(簡稱為堆性質):

(1) ki≤k2i且ki≤k2i+1 或(2)ki≥k2i且ki≥k2i+1(1≤i≤)

若將此序列所儲存的向量r[1……n]看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。

堆的這個性質使得可以迅速定位在乙個序列之中的最小(大)的元素。

堆排序演算法的過程如下:1)得到當前序列的最小(大)的元素

(2)把這個元素和最後乙個元素進行交換,這樣當前的最小(大)的元素就放在了序列的最後,而原先的最後乙個元素放到了序列的最前面

(3)的交換可能會破壞堆序列的性質(注意此時的序列是除去已經放在最後面的元素),因此需要對序列進行調整,使之滿足於上面堆的性質。重複上面的過程,直到序列調整完畢為止。

/*

*堆排序 */

void heapsort(int *arr,intn)

} /*

構建大頂堆 */

void buildmaxheap(int *arr,intn)

} /*

*調整大頂堆 */

void heapadjust(int *arr,int start,intn)

else

break;

} if(rightchild==n)//

只有左節點,沒有右節點 }

7、歸併排序

歸併排序的演算法思想:把待排序序列分成相同大小的兩個部分,依次對這兩部分進行歸併排序,完畢之後再按照順序進行合併

/*

自底向上歸併排序 */

void mergesort(int *arr,intn)

} /*

功能:將兩個有序陣列歸併到一起 */

void merge(int *arr,int start,int mid,int

end)

else }

while(iarr2[p++]=arr[i++];

while(jarr2[p++]=arr[j++];

p=0;

for(i=start;i)

delete arr2; }

/*根據間隔,進行歸併 */

void mergepass(int *arr,int interval,intn)

if(i+intervalmerge(arr,i,i+interval,n); }

/*自頂向下二路歸併演算法 */

void mergesortdc(int *arr,int start,int

end)

}

8、基數排序

//

基數排序

void radixsort(int *arr,intn)

p=0;

for(int i=0;i<10;i++)

ivec[i].clear();

}basenum*=10; }

}

排序演算法 選擇排序演算法實現

1 時間複雜度 o n 2 2 選擇排序主要操作是交換和比較 交換次數在0 n 1 總比較次數 n n 1 n 2 n 3 1 n n 1 2 因為交換需要的cpu時間 比較需要的cpu時間 當n比較少時,選擇比冒泡快,減少了不必要的交換,每次交換僅僅是最大值或者最小值與序列起始位置進行狡猾。3 演...

排序演算法實現

自己實現的排序演算法,用來複習 include using namespace std void swap int a,int b void headp adjust int a,int s,int m else break a s temp void bubble sort int a,int l...

c 排序演算法程式

paixu.cpp 定義控制台應用程式的入口點。include stdafx.h include iostream include vector include using namespace std struct student bool compare int a,int b nth eleme...