排序

来源:互联网 发布:oracle 索引优化 编辑:程序博客网 时间:2024/06/01 07:48

这里写图片描述

#define  _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;void swap(int *a, int *b) {    *a = *a ^ *b;    *b = *a ^ *b;    *a = *a ^ *b;}//插入排序//比如 49, 38, 65, 97, 76, 13, 27。当i指向76时,前面比76大的数依次向后移1位,再把76插入空挡。void insertSort(int *arr, int len) {    for (int i = 1; i < len; i++) {        int j_bound = i; //保存插入位置        int tmp = arr[i]; //保存插入值        for (int j = i - 1; j >= 0 && arr[j]>tmp; j--) {            arr[j + 1] = arr[j];            j_bound = j;        }        arr[j_bound] = tmp;    }    for (int i = 0; i < len; i++)        cout << arr[i] << endl;}//选择排序//与冒泡排序差别是:冒泡算法,每次比较如果发现较小的元素在后面,就交换两个相邻的元素。//选择排序算法的改进在于:先并不急于调换位置,看哪个数最小就记下该数所在的位置P,等一躺扫描完毕,再把A[P]和A[1]对调void selectSort(int *arr, int len) {    for (int i = 0; i < len; i++) {        int min = i; //初始位置        for (int j = i + 1; j < len; j++) {            if (arr[min]>arr[j])                min = j;        }        if (i != min)            swap(arr[i], arr[min]);    }    for (int i = 0; i < len; i++)        cout << arr[i] << endl;}//快速排序void quickSort(int *arr, int first, int last) {    if (first>=last)        return;    int tmp_first = first;    int tmp_last = last;    int tmp = arr[first];    while (first < last) {        while (first < last && arr[last]>tmp) {            last--;        }        swap(tmp, arr[last]);        while (first < last && tmp>arr[first]) {            first++;        }        swap(tmp, arr[first]);    }    quickSort(arr, tmp_first, first - 1);    quickSort(arr, first + 1, tmp_last);}int main() {    int arr[] = { 49, 38, 65, 97, 76, 13, 27 };    int len = sizeof(arr) / sizeof(arr[0]);    //insertSort(arr, len);    //selectSort(arr, len);    quickSort(arr, 0, len-1);    for (int i = 0; i < len; i++)        cout << arr[i] << endl;    system("pause");    return 0;}
package pack;class Method {    //插入排序    void insetSort(int[] arr, int len) {        for(int i = 1; i<len; i++) {            int tmp_i = i;  //插入点            int tmp = arr[i];//插入值            for(int j = i-1; j>=0 && arr[j]>tmp; j--) {                arr[j+1] = arr[j];                tmp_i = j;            }            arr[tmp_i] = tmp;        }    }    //选择排序    void selectSort(int[] arr, int len) {        for(int i=0;i<len;i++) {            int min = i;            for(int j=i+1; j<len; j++) {                if(arr[j]<arr[min])                    min = j;            }            if(min != i) {                arr[i] = arr[i] ^ arr[min];                arr[min] = arr[i] ^ arr[min];                arr[i] = arr[i] ^ arr[min];            }        }       }    //快速排序    void quickSort(int[] arr, int first, int last) {        if(first>=last)            return ;        int tmp_first = first;        int tmp_last = last;        int tmp = arr[first];        while(first<last) {            while(first<last && tmp<arr[last]) {                last--;            }            arr[last] = arr[last] ^ tmp;            tmp = arr[last] ^ tmp;            arr[last] = arr[last] ^ tmp;            while(first<last && tmp>arr[first]) {                first++;            }            arr[first] = arr[first] ^ tmp;            tmp = arr[first] ^ tmp;            arr[first] = arr[first] ^ tmp;            quickSort(arr, tmp_first, first-1);            quickSort(arr, first+1, tmp_last);        }    }}//希尔排序public static int[] shellSort(int[] arr) {        int gap = arr.length;        do{            gap = gap/3 + 1;            for(int i=gap; i<arr.length; i+=gap) {                int tmp_j = i;                int tmp = arr[i];                for(int j=i-gap; j>=0; j-=gap) {                    if(arr[j] > tmp) {                        arr[j+gap] = arr[j];                        tmp_j = j;                    }                }                arr[tmp_j] = tmp;            }        }while(gap>1);        return arr;    }   //归并排序public static void mergeSort(int[] arr, int left, int right) {        if(left >= right)            return;        int mid = (left + right) / 2;        mergeSort(arr, left, mid);        mergeSort(arr, mid+1, right);        merge(arr, left, mid, right);        System.out.println(Arrays.toString(arr));    }    private static void merge(int[] arr, int left, int mid, int right) {        int[] tmp_arr = new int[arr.length];        int center = mid + 1;        int i = left;        int tmp = left;        while (left <= mid && center <= right) {              if(arr[left] <= arr[center]) {                tmp_arr[i++] = arr[left++];            } else {                tmp_arr[i++] = arr[center++];            }        }        while(left <= mid) {            tmp_arr[i++] = arr[left++];        }        while(center <= right) {            tmp_arr[i++] = arr[center++];        }         while (tmp <= right) {                  arr[tmp] = tmp_arr[tmp++];          }      }public  class Main {    public static void main(String[] args) {        Method m = new Method();        int[] arr = {49, 38, 65, 97, 76, 13, 27};        //m.insetSort(arr, arr.length);        //m.selectSort(arr, arr.length);        m.quickSort(arr, 0, arr.length-1);        for(int i: arr) {            System.out.println(i);        }    }}
//堆排序package cc.stack.application;public class Main1 {    public static void print(int[] arr) {        for(int i : arr)            System.out.print(i);        System.out.println("\n");    }    public static void swap(int[] arr, int a, int b) {        int tmp = arr[a];        arr[a] = arr[b];        arr[b] = tmp;    }    public static void heapSort(int[] arr) {        for(int i=0; i< arr.length; i++) {            createMaxHeap(arr, arr.length-1-i);            swap(arr, 0, arr.length-1-i);            print(arr);        }    }    public static void createMaxHeap(int[] arr, int lastIndex) {        int startCompareIndex = (lastIndex-1)/2;  //开始比较的结点,关键点的选取        for(int i=startCompareIndex; i>=0; i--) {            int k = i; //保存这个当前结点            while(2*k+1 <= lastIndex) {   //while循环是防止后面的改动影响前面的结果                int bigger_index = k*2+1; //先设左子结点为最大点                if(k*2+1 <= lastIndex) { //如果它有左子结点                    if(k*2+2 <= lastIndex &&  //有右子结点,且右子结点大于左子结点                            arr[k*2+2]>arr[bigger_index]) {                         bigger_index++;                    }                }                if(arr[k] < arr[bigger_index]) {                    swap(arr, k, bigger_index);                //bigger_index把大值给别人,自己这边可能会出问题,设k为这个地方,在while循环里再次检验                    k = bigger_index;                  } else                     break;                }        }    }    public static void main(String[] args) {        int[] arr = new int[]{5, 3, 6, 2, 1, 9, 4, 8, 7 };         heapSort(arr);        print(arr);    }}
0 0
原创粉丝点击