1.常用算法
1.1.冒泡排序算法
冒泡排序是排序算法的一种,思路明晰,代码简洁,常被用在大学生计算机课程中。“冒泡〞这个名字的由来是因为越大的元素会经由交换渐渐“浮〞到数列的顶端,故名。
冒泡排序java代码详解这里以从小到大排序为例进展讲解
1.1.1.根本思想及举例说明
冒泡排序的根本思想就是不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较,就选出最大的数;经过第2轮比较,就选出次大的数,以此类推。
下面以对3    2    4    1 进展冒泡排序说明。
第一轮排序过程
3    2
4    1 〔最初〕
2    3    4    2 〔比较3和2,交换〕
2    3    4    1 〔比较3和4,不交换〕
2    3    1    4 〔比较4和1,交换〕
第一轮完毕,最大的数4已经在最后面,因此第二轮排序只需要对前面三个数进展再比较。
第二轮排序过程
2    3    1    4 〔第一轮排序结果〕
2    3    1    4 〔比较2和3,不交换〕
2    1
3
4 〔比较3和1,交换
第二轮完毕,第二大的数已经排在倒数第二个位置,所以第三轮只需要比较前两个元素。
第三轮排序过程
2    1
3
4 〔第二轮排序结果〕
1    2    3    4 〔比较2和1,交换〕
至此,排序完毕。
1.1.
2.算法总结及实现
对于具有N个元素的数组R[n],进展最多N-1轮比较;
第一轮,逐个比较〔R[1], R[2]〕, 〔R[2], R[3]〕, 〔R[3], R[4]〕, ……. 〔R[N-1], R[N]〕; 最大的元素会被挪动到R[N]上。
第二轮,逐个比较〔R[1], R[2]〕, 〔R[2], R[3]〕, 〔R[3], R[4]〕, ……. 〔R[N-2], R[N-1]〕;第二大元素会被挪动到R[N-1]上。
。。。。
以此类推,直到整个数组从小到大排序。
下面给出了冒泡排序的一般实现和优化实现。一般实现是教科书里常见的实现方法,无论数组是否排序好了,都会进展N-1轮比较;而优化实现,在数组已经排序好的情况下,会提早退出比较,减小了算法的时间复杂度。
//优化实现
void bubble_sort_better(int a[], int n) //n为数组a的元素个数{
//最多进展N-1轮比较
for (int i = 0; i< n - 1; i++) {
int isSorted = 1;
//每一轮比较前n-1-i个,即已排序好的最后i个不用比较
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
isSorted = 0;
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
if (isSorted)
break; //假设没有发生交换,说明数组已经排序好了}
}
int main() {
1.2.选择排序算法
选择排序是排序算法的一种,这里以从小到大排序为例进展讲解。
1.2.1.根本思想及举例说明
选择排序〔从小到大〕的根本思想是,首先,选出最小的数,放在第一个位置;然后,选出第二小的数,放在第二个位置;以此类推,直到所有的数从小到大排序。
在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进展交换。
下面,以对3    2    4    1 进展选择排序说明排序过程,使用min_index记录当前最小的数所在的位置。