排序算法总结
各种排序算法总结
// // mySorts.c // mySorts // // Created by chen on 13-9-25. // Copyright (c) 2013年 chen. All rights reserved. // #include <stdio.h> #include "mySorts.h" /** 原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。 要点:设立哨兵,作为临时存储和判断数组边界之用。 **/ void insertSort(int a[], int length) { printf("paixu\n"); int i, j, k; for (i = 1; i < length; i++) { //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置 for (j = i - 1; j >= 0; j--) if (a[j] < a[i]) break; //如找到了一个合适的位置 if (j != i - 1) { //将比a[i]大的数据向后移 int temp = a[i]; for (k = i - 1; k > j; k--) a[k + 1] = a[k]; //将a[i]放到正确位置上 a[k + 1] = temp; } } for (int n=0; n<length; n++) { printf("%d ", a[n]); } } void insertSort2(int a[], int length) { int i, j; for (i=1; i<length; i++) { if (a[i] < a[i-1]) { int temp = a[i]; for (j=i-1; j>=0&&temp<a[j]; j--) { a[j+1] = a[j]; } a[j+1] = temp; } } } void shell(int a[], int length, int gap) { int i,j; //int gap = length/2; for (i=gap+1; i<length; i++) { if (a[i] < a[i-gap]) { int temp = a[i]; j = i-gap; while (j>0 && a[j]>temp) { a[j+gap] = a[j]; j = j-gap; } a[j+gap] = temp; } } } void shellSort(int a[], int length) { int gap = length/2; while (gap >= 1) { shell(a, length, gap); gap = gap/2; } } void bubbleSort(int a[], int length) { int i,j; int exchange = 1; for (i=0; i<length; i++) { exchange = 0; for (j=length-1; j>=i; j--) { int temp = 0; if (a[j+1] < a[j]) { temp = a[j+1]; a[j+1] = a[j]; a[j] = temp; exchange = 1; } } if (!exchange) { return; } } } int partition(int a[], int i, int j) { int par = a[i]; while (i<j) { while (i<j && a[j]>=par) { j--; } if (i<j) { a[i] = a[j]; i++; } while (i<j && a[i]<=par) { i++; } if (i<j) { a[j] = a[i]; j--; } } a[i] = par; return i; } void quickSort(int a[], int low, int high) { int parpos; if (low < high) { parpos = partition(a, low, high); quickSort(a, low, parpos-1); quickSort(a, parpos+1, high); } } void selectSort(int a[], int length) { int i,j,k; int temp; for (i = 0; i<length; i++) { k = i; for (j=i+1; j<length; j++) { if (a[j] < a[k]) { k=j; } } if (k != i) { temp = a[i]; a[i] = a[k]; a[k] = temp; } } } void printArray(int a[], int length) { for (int i=0; i<length; i++) { printf("%d ",a[i]); } printf("\n"); } void maxHeapify(int a[],int i, int length) { int left = 2*i; int right = 2*i+1; int largest = i; if (left < length && a[left]>a[i]) { largest = left; } if (right < length && a[right]>a[largest]) { largest = right; } if (largest != i) { int temp = a[i]; a[i] = a[largest]; a[largest] = temp; maxHeapify(a, largest, length); } } void buildMaxHeap(int a[], int length) { for (int i=length/2; i>=0; i--) { maxHeapify(a, i, length); } } void heapSort(int a[], int length) { buildMaxHeap(a, length); printf("MaxHeap.."); printArray(a, length); int len = length; for (int i=length-1; i>=1; i--) { int temp = a[0]; a[0] = a[i]; a[i] = temp; len--; maxHeapify(a, 0, len); printf("processing.."); printArray(a, length); } } void mergeArray(int a[], int first, int mid, int last, int temp[]) { int i = first; int j = mid+1; int m = mid; int n = last; int k = 0; while (i <= m && j<=n) { if (a[i] < a[j]) { temp[k++] = a[i++]; } else { temp[k++] = a[j++]; } } while (i <= m) { temp[k++] = a[i++]; } while (j <= n) { temp[k++] = a[j++]; } for (i =0; i<k; i++) { a[first+i] = temp[i]; } } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first+last)/2; mergesort(a, first, mid, temp); mergesort(a, mid+1, last, temp); mergeArray(a, first, mid, last, temp); } } void mergeSort(int a[], int length) { int *p = (int*)malloc(sizeof(int)*length); if (p == NULL) { return; } mergesort(a, 0, length-1, p); free(p); p=NULL; }