排序
来源:互联网 发布: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