排序算法

来源:互联网 发布:linux 打开vim编辑器 编辑:程序博客网 时间:2024/06/05 19:31
再次看看排序算法
1.插入排序
   1.1   直接插入排序
     直接插入排序算法的核心思想是,将第 i 个记录插入到前面 i-1 个已经有序的集合中。
这是别人的代码:
 public static void InsertSort(int[] array){
    int i=0,j=0,key;
    for (i=1;i<10;i++){
        key = array[i];
        j = i-1;
        while(j>=0&&key<array[j]){
            //需要移动位置,将较大的值array[j]向后移动一个位置
            array[j+1] = array[j];
            j--;
        }
        //循环结束说明找到适当的位置了,是时候插入值了
        array[j+1] = key;
    }
    //输出排序后的数组内容
    for (int value  : array){
        System.out.print(value+",");
    }
}


//主函数中对其进行调用
int[] array = {1,13,72,9,22,4,6,781,29,2};
InsertSort(array);
1.2    二分折半插入排序
首先这是我的代码,颇为臃肿
public class test01 {
public static void main(String[] args) {
int[] array = { 1, 13, 72, 9, 22, 4, 6, 781, 29, 2 };
InsertSort(array);
}


private static void InsertSort(int[] array) {
// TODO Auto-generated method stub
int len = array.length;
for (int i = 1; i < len; i++) {
//插入序列i个数字
int k = i - 1;
int high = k;
int low = 0;
int temp = array[i];
int cur=1;
while (high>=low) {

if(temp>=array[high]){
cur=high+1;
break;
}
if(temp<=array[low]){
cur=low;
break;
}
int mid=(high+low)/2;
if(array[mid]>temp){
high=mid;
}
if(array[mid]<temp){
low=mid;
}
if(array[mid]==temp){
cur=mid;
break;
}
if(high-low==1){
cur=high;
break;
}
}

for(int x=i;x>cur;x--){
array[x]=array[x-1];
}
array[cur]=temp;

}
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}




这是别人的代码,我修改了bug之后为这样
private static void InsertSort01(int[] array) {
   for(int k=1;k<array.length;k++){
       int key = array[k];
       //找到合适的位置
       int low,high,mid;
       low = 0;high = k-1;
       while(low <= high){
           mid = (low+high)/2;
           if(key == array[mid]){
            low=mid;
            break;
           }
           
           else if(key > array[mid]){
               low = mid+1;
           }else{
               high = mid-1;
           }
       }
       //low的索引位置就是即将插入的位置
       //移动low索引位置后面的所有元素
       for(int x=k-1;x>=low;x--){
           array[x+1] = array[x];
       }
       array[low] = key;
   }
   //遍历输出有序队列内容
   for(int key:array){
       System.out.print(key + ",");
   }
}




希尔排序
希尔排序算法使用一个距离增量来切分子序列


private static void oneShellSort(int[] array, int delet) {
// TODO Auto-generated method stub
int len = array.length;


// 前面为有序数列
for (int i = delet; i < len; i++) {
int temp = array[i];
int j = i - delet;
if (temp < array[j]) {
while (j >= 0 && array[j] > temp) {
array[j + delet] = array[j];
j -= delet;
}
array[j+delet]=temp;
}
}


}
  1、冒泡排序
     冒泡排序通过两两比较,每次将最大或者最小的元素移动到整个序列的一端。
    
原创粉丝点击