从排序算法开始

215 阅读2分钟

1.选择排序

排序步骤

  • 首先从为排序的数组中找到最小(大)的元素,放在排序序列起始位置
  • 再从剩余元素中找到最小(大)元素,放在已排序列末尾
  • 重复第二步,直至结束。
void selectSort(int arr[]){
    for(int i = 0; i<arr.length; i++){
        int min = i;
        for(int j = i+1; j<arr.length; j++){
            if(arr[j]<arr[i]){
                min = j;
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

冒泡排序

排序步骤

  • 比较相邻元素,如果第1个比第2个大(小),交换位置
  • 每一对相邻元素重复比较,从第一组直至最后一组,最后大元素,将是最大的。
  • 重复操作,直至结束
void bubbleSort(int arr[]){
    for(int i = 0; i < arr.length; i++){
        for(int j = 0; j < arr.length - i -1; j++){
            if(arr[j]>arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

归并排序

排序步骤

  • 申请两个空间,其和大小是排序数组大小
  • 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  • 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  • 重复步骤 3 直到某一指针达到序列尾
  • 将另一序列剩下的所有元素直接复制到合并序列尾
/*不好写,以后再写吧*/

插入排序

排序步骤

  • 把第一个元素不动,第二个至最后一个元素进行当成未排序元素
  • 从头至尾进行扫描,将扫描到的元素放到合适的位置
void insertSort(int arr[]){
    for(int i = 1,i < arr.length, i++){
        for(int j = i, j > 0, j--){
            if(arr[j] < arr[j-1]){
                int temp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = temp;
            }
        }
    }
}

快速排序

排序步骤

  • 序列中挑一个"基准"(pivot)
  • 排序数组,小于基准的放在基准前面,大于基准的放在基准后面。分区
  • 递归调用排序分区
void quickSort(int arr[], int low, int high){
    if(low < high){
        int index = getIndex(arr, low, high);
        quickSort(arr, 0, index-1);
        quickSort(arr, index+1, high);
    }
}
int getIndex(int arr[], int low, int high){
    int tmp = arr[low];
    while(low < high){
        while(low < high && arr[high] >= tmp){
            high--;
        }
        arr[low] = arr[high];
        while(low < high && arr[low] <= tmp){
            low++;
        }
        arr[high] = arr[low];
    }
    arr[low] = tmp;
    return low;
}

堆排序

/*不好写,以后再说*/