【题目10】基本的排序算法

解题思路:排序算法有很多种,插入排序,冒泡排序,希尔排序(ShellSort),快速

排序,堆排序,归并排序,基排序等。作为一名软件开发人员,需要能够自己动手实

现这些算法,掌握这些算法的思想,以及这些算法的时间复杂度,空间复杂度。虽然

很时候,在实际的工作中,有库函数可以提供给我们使用,但是我们不仅要知其然更

要知其所以然,掌握了它了,或许以后你的程序需要优化的时候会派的上用场呢。

 

说明: 这里的大部分代码都摘自《数据结构与算法分析---C语言描述》。对于大牛写

的代码,不得不膜拜啊。。。

 

1. 插入排序,时间复杂度0(n^2)

#include <stdio.h> void InsertionSort(int *a, int len) { int i,j; int tmp; for( i = 1; i < len; i++) { tmp = a[i]; for(j = i; j > 0 && a[j-1] > tmp; --j) a[j] = a[j-1]; a[j] = tmp; } } void Print(int* a, int len) { for(int i = 0; i < len; i++) printf("%d ", a[i]); printf("/n"); } int main() { int a[5] = {3, 1, 7, 2, 4}; int len = sizeof(a)/sizeof(int); Print(a,len); InsertionSort(a, len); Print(a,len); return 0; }

2. 冒泡排序,时间复杂度O(n^2),没有优化

void BubbleSort(int *a, int len) { for(int i = 0; i < len; i++) { int tmp = a[i]; for(int j = i+1; j < len; j++) { if(a[j] < a[i]) { a[i] = a[j]; a[j] = tmp; } } } }

3. 希尔排序

void ShellSort(int *a,int len) { int tmp; for(int inc = len/2; inc > 0; inc /= 2) for(int i = inc; i < len; i++) { tmp = a[i]; for(int j = i; j >= inc; j -= inc) if(tmp < a[j - inc]) a[j] = a[j - inc]; else break; a[j] = tmp; } }

4. 堆排序

#define LeftChild(i) (2*i + 1) //因为它是从位置0开始的 void Swap(int* a, int *b) { int tmp = *a; *a = *b; *b = tmp; } void PercDown(int *a, int i, int len) { int child; int tmp; for(tmp = a[i]; LeftChild(i) < len; i = child) { child = LeftChild(i); if(child != len -1 && a[child + 1] > a[child]) child++; if(tmp < a[child]) a[i] = a[child]; else break; } a[i] = tmp; } void HeapSort(int* a, int len) { int i; for( i = len/2; i >= 0; i--) PercDown(a,i,len); //建堆 for( i = len -1; i > 0; i--) { Swap(&a[0],&a[i]); PercDown(a,0,i); //调堆 } }

5. 归并排序

void Merge(int *a, int *tmpArr, int lPos, int rPos, int rightEnd) { int i, leftEnd, numElements, tmpPos; leftEnd = rPos - 1; tmpPos = lPos; numElements = rightEnd - lPos + 1; while(lPos <= leftEnd && rPos <= rightEnd) if(a[lPos] <= a[rPos]) tmpArr[tmpPos++] = a[lPos++]; else tmpArr[tmpPos++] = a[rPos++]; while(lPos <= leftEnd) tmpArr[tmpPos++] = a[lPos++]; while(rPos <= rightEnd) tmpArr[tmpPos++] = a[rPos++]; for(i = 0; i < numElements; i++, rightEnd--) a[rightEnd] = tmpArr[rightEnd]; } void MSort(int*a, int *tmpArr,int left, int right) { int mid; if(left < right) { mid = (left + right) /2; MSort(a, tmpArr, left, mid); MSort(a, tmpArr, mid + 1, right); Merge(a, tmpArr, left, mid+1, right); } } void MergeSort(int* a, int len) { int *tmpArr; tmpArr = (int*)malloc(len*sizeof(int)); if(tmpArr != NULL) { MSort(a,tmpArr,0, len-1); free(tmpArr); } else printf("Alloc memory failed!"); }

6.快速排序

int Median3(int *a, int left, int right) { int mid = (left + right)/2; if(a[left] > a[mid]) Swap(&a[left],&a[right]); if(a[left] > a[right]) Swap(&a[left],&a[right]); if(a[mid] > a[right]) Swap(&a[mid],&a[right]); Swap(&a[mid], &a[right -1]); return a[right-1]; } #define Cutoff 3 void QSort(int *a, int left, int right) { int i, j; int pivot; if(left + Cutoff <= right) { pivot = Median3(a, left, right); i = left; j = right - 1; for( ; ; ) { while(a[++i] < pivot){} while(a[--j] > pivot){} if(i < j) Swap(&a[i],&a[j]); else break; } Swap(&a[i], &a[right-1]); QSort(a,left,i-1); QSort(a,i+1, right); } else InsertionSort(a+left, right - left +1 ); } void QuickSort(int *a, int len) { QSort(a, 0, len-1); }

你可能感兴趣的:(数据结构,算法,优化,null,PIVOT,merge)