冒泡排序
思路:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
int[] arr = new int[];
for( int i = 0;i<arr.length;i++) {
for( int j = 0;j<arr.length-1-i;j++) {
if( arr[j] = arr[j+1] ) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
选择排序
思路:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
int[] arr = new int[];
for( int i=0;i<arr.length-1;i++) {
int last = arr.length-1-arr;
int max = 0;
for( int j=0;j<arr.length-arr;j++) {
if( arr[max]>arr[j]) {
max=j;
}
}
if( max!=last ) {
int temp = arr[max];
arr[max] =arr[last];
arr[last] = temp;
}
}
插入排序
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
int[] arr = new int[];
for( int i=0;i<arr.length-1;i++) {
int curr = arr[i+1];
fo( int j=i;j>=0;j--) {
if( curr<arr[j] ) {
arr[j+1] = arr[j];
}else {
break;
}
arr[j] = curr;
}
}
希尔排序
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高
int[] arr = new int[];
for( int i=arr.length/2;i>0;i/=2 ) {
for( int j=i;j<arr.length;j++ ) {
for( int k=j;k>0&&k-i=0;k-=i ) {
if( arr[k]<arr[k-i] ) {
int temp = arr[k];
arr[k] = arr[k-i];
arr[k-i] = temp;
}else break
}
}
}