几个常用的排序算法实现:
一、快速排序
二、冒泡排序
//从左向右冒泡 void bubble_sort(int a[], int n) { int i, j, temp; for (j = 0; j < n - 1; j++)
{ for (i = 0; i < n - 1 - j; i++) { if(a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } } }
对上面的方法进行优化:
//从左向右冒泡 void bubble_sort(int a[], int n) { int i, j, temp, flag; for (j = 0; j < n - 1; j++) { flag = 0; for (i = 0; i < n - 1 - j; i++) { if(a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; flag = 1; } } if(flag == 0) break; }
//从右向左冒泡 //参数A[] 把需要的数组给我,以及数组的元素个数也给我 我将给你一个有序的数组 template<typename T> void Bubble_Sort(T A[], int n) { int flag = 0; //标志初始为0表示没有发现元素交换 为了改善性能用,如果没有元素交换说明本来就有序直接跳出循环 //由上面分析我们知道了排序的回合数是n - 1; //开始循环回合数 for(int i = 0; i < n - 1; i++) { //我们规定大索引的数是看成河底下的泡泡 依次索引减少 泡泡就位于接近地面 //开始真正的每一趟的比较 //j我们先从最大索引也就是水最底层开始拿出数据或者叫泡泡去和上个索引对应的泡泡比较大小 //如果大索引的泡泡也就是数值大我们就让泡泡和小泡泡交换位置也称为向上冒泡 //这个时候j--就拿到最大索引--之后的冒泡继续比较 //当索引出现等于i + 1的时候 说明第一趟冒泡完毕 我们把最小的泡泡冒到最上层 //然后外面的循环继续选择第二个最小的泡泡依次冒............. for(int j = n - 1; j >= 1 + i; j-- ) { if(A[j] > A[j - 1]) { //交换下元素 Swap(A[j],A[j + 1]); flag = 1; //表示元素交换过 } } //第一趟比较完后开始跑后面代码 这个时候我们就可以了解是不是换过元素 //开始判断标志 来了解元素是不是早就有序 if(flag == 0) { break; //说明元素有序了,直接跳出循环 } flag = 0; } } //排序时间复杂度分析:最好的情况就是我们执行完第一趟就发现已经序,这个时候我们仅仅是和这个n也就是元素的多少有关。时间复杂度为0(n) //最坏情况: 每一趟是时间复杂度是n 进行了n - 1趟。 那么最终是n*(n - 1) 时间复杂度则为0(N^2) //注意:请学习思路,不要用我的代码,我代码是直接在博客手写的,没有去vs上写,我希望分享的思想是,程序来源于生活。用现实去架构代码思想,我相信你进步很大。 //具体代码实现如果不是按照直接思想写出来的,我想对你们意义并不大。有什么问题可以直接提出。 我不保证代码的正确性,千万别想着克隆我的直接运行成功就完事,这样可能对你们没有多少好处,实现代码其实很多。
三、选择排序