定义数组arr
int[] arr={3,6,2,13,24,15,7};
冒泡排序
- 冒泡排序原理以第一次循环过程为例:
原数组:3,6,2,13,24,15,7
step1:3和6比较,3<6,不换=>3,6,2,13,24,15,7
step2:6和2比较,6>2,交换=>3,2,6,13,24,15,7
step3:6和13比较,6<13,不换=>3,2,6,13,24,15,7
step4:13和24比较,13<24,不换=>3,2,6,13,24,15,7
step5:24和15比较,24>15,交换=>3,2,6,13,15,24,7
step6:24和7比较,24>7,交换=>3,2,6,13,15,7,24 - 总结:在每一次循环后,最大的数会"上浮"到数组末端,所以叫冒泡排序。
- 代码实现:
for (int i = 0,t; i <arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]>arr[j+1]){
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
选择排序
- 选择排序原理:假设maxIx为最大数字所在位置(初值为本次循环末端),maxValIx为最大数字值下标(初值为0),每次循环比较arr[maxValIx]是否为最大值,arr[maxValIx]和arr[maxIx]是否相符,最终目的是将最大数字放置末尾。
- 代码实现:
for (int i = 0,maxIx,maxValIx,t; i < arr.length-1; i++) {
maxIx=arr.length-1-i;
maxValIx=0;
for (int j = 1; j <= arr.length-1-i; j++) {
if(arr[maxValIx]<arr[j]){
maxValIx=j;
}
if(maxIx!=maxValIx){
t=arr[maxValIx];
arr[maxValIx]=arr[maxIx];
arr[maxIx]=t;
}
}
}
插入排序
- 插入排序原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
- 代码实现:
for (int i = 1,t; i < arr.length-1; i++) {
for (int j = i; j >0 && arr[j]<arr[j-1] ; j--) {
t = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = t;
}
}
希尔排序
- 希尔排序原理:把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行排序,通过多次循环形成一个相对(原数组)有序的数组。最后使用插入排序对其排序(此时插入排序的效率相当高)。
- 代码实现:
int step = arr.length,t;
while((step/=2)>=2) {
for (int i = 0; i+step<arr.length; i++) {
t = arr[i];
arr[i] = arr[i+step];
arr[i+step] = t;
}
}
for (int i = 1; i < arr.length; i++) {
for (int j = i; j >0 && arr[j]<arr[j-1] ; j--) {
t = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = t;
}
}
桶排序
- 桶排序原理:划分多个范围相同的区间,每个子区间自排序,最后合并。
- 代码实现:
final int U = 10;
int[][] bucket = new int[U][arr.length];
int[] ixs =new int[30];
for (int i = 1,count,t;; i*=10) {
count = 0;
for (int j = 0; j < arr.length; j++) {
count = (t=arr[j]/i)>=1 ? ++count : count ;
bucket[t%=U][ixs[t]++]=arr[j];
}
if(count==0)break;
for (int j = 0,ix=0; j < bucket.length; j++) {
for (int k = 0; k < ixs[j]; k++) {
arr[ix++] = bucket[j][k];
}
}
for (int j = 0; j < ixs.length; j++) {
ixs[j]=0;
}
}