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,intend)
} 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...