各种常用的排序算法实现对数组的排序——整理总结(代码实现)

来源:互联网 发布:怎么弄公司企业域名 编辑:程序博客网 时间:2024/06/05 22:42
冒泡排序、插入排序、折半排序(二分插入排序)、快速排序、选择排序、归并排序、希尔排序、堆排序
#include <stdio.h> #include <algorithm>#include <iostream>using namespace std;//冒泡排序 void bubble_sort(int a[],int n) {  int i,j;  for(i = 0;i < n-1; i++)  {   bool exchange = false;   for(j = n-1;j > i; j--)   {    if(a[j-1] > a[j])    {     exchange = true;     swap(a[j-1], a[j]);    }   }    if(exchange == false)    break;  } } //直接插入排序void insert_sort(int a[],int n) {  int i,j;  for(i = 1;i < n; i++)  {   int t = a[i];   for(j = i; j > 0 && a[j-1] > t; j--)    a[j] = a[j-1];   a[j] = t;  } } //折半排序、二分插入排序 //实现1 void Insert_sort(int *pArr, int len) {  // 定义二分法插入排序的函数    int temp, low, up;    // temp用于存放插入值, low表示下界, up表示上界    for (int i = 1; i < len; i++) {        temp = pArr[i];    // 保存插入值        low = 0;   // 下界肯定为0        up = i - 1;   // 上界就是除去插入值剩余元素的最大下标        while (low <= up) {  // 当up移动到low左侧时,结束循环。注意,此处一定要带有等号,否则排序会失败,可以举例说明            if (temp > pArr[(low+up)/2])                low = (low + up)/2 + 1;  // 当插入值大于中间值,将下界移动到中界+1的位置            else                up = (low + up)/2 - 1; // 当插入值小于中间值,将上界移动到下界-1的位置        } // 对low和up处理使得在决定好插入位置后up在low之前以跳出循环        for (int j = i-1; j >= low; j--)   //  该循环起到将元素后移的作用            pArr[j+1] = pArr[j];        pArr[low] = temp;   // 将插入值插入    }    return;}void InsertSort_find(int X, int *pArr, int low, int up) {    if (up < low){        printf("Can't find X\n");        return;    }    int mid = (up + low)/2;    if (X == pArr[mid]) {         printf("The index is %d\n", mid);           return;    } else if (X < pArr[mid]) {        InsertSort_find(X, pArr, low, mid-1);     } else {         InsertSort_find(X, pArr, mid+1, up);     }} //实现2void BinaryInsertSort(int *a, int n)     {      int i,j,k,low,high,m;      for(i = 1; i < n; i++) {          low = 0;          high = i - 1;            while(low <= high) {              m = (low + high) / 2;              if(a[m] > a[i]) high = m - 1;              else low = m + 1;          }            if(j != i - 1) {              int temp = a[i];              for(k = i - 1; k >= high + 1; k--)                  a[k + 1] = a[k];              a[k + 1] = temp;          }      }  }   //快速排序void quick_sort(int a[],int l,int r) {  if(l >= r)   return;  int i,j,p;  i = l-1, j = r;    p = l + rand()%(r-l);  swap(a[p],a[r]);  p = a[r];  while(1)  {   do { i++; } while(a[i] < p && i < r);   do { j--; } while(a[j] > p && j > l);   if(i >= j)    break;   swap(a[i], a[j]);  }  swap(a[i], a[r]);  quick_sort(a, l, i-1);  quick_sort(a, i+1, r); } //选择排序void select_sort(int a[],int n) { int i,j; for(i = 0; i < n-1; i++) {   int min = i;   for(j = i+1; j < n; j++)   {    if(a[j] < a[min])     min = j;   }   if(min != i)    swap(a[i], a[min]); } } //堆排序void heap_siftdown(int a[],int n,int p) //调整算法 { int i = p,j = i*2+1; int tmp = a[i]; while(j < n) {   if(j+1 < n && a[j] < a[j+1])   j++;   if(a[j] <= tmp)   break; else  {    a[i] = a[j];    i = j;j = j*2+1;   } } a[i] = tmp; } void heap_sort(int a[],int n) {  int i;  for(i = (n-1)/2; i >= 0;i--)   heap_siftdown(a, n, i);  for(i = n-1;i >= 0; i--)  {   swap(a[i], a[0]);   heap_siftdown(a, i, 0); } } //希尔排序void shell_pass(int a[],int n,int inc) //inc为1时,其实就是直接插入排序 { int i,j; for(i = inc; i < n; i++) {     int t=a[i];     for(j = i;j >= inc && a[j-inc] > t; j-= inc)     a[j] = a[j-inc];   a[j] = t;  } } void shell_sort(int a[],int n) { int i = n; do{ i = i/3 + 1; shell_pass(a, n, i); }while(i > 1); } //归并排序void merge(int a[],int b[],int l,int m,int r) {  int i,j,k;  for(i = l; i <= r; i++)   b[i] = a[i];  i = l; j = m+1; k = l;  while(i <= m && j <= r)  {   if(b[i] <= b[j]) a[k++] = b[i++];   else a[k++] = b[j++];  }  while(i <= m) a[k++] = b[i++];  while(j <= r) a[k++] = b[j++]; }  void merge_sort(int a[],int b[],int l,int r) {  if(l >= r)   return;  int m = (l+r)/2;  merge_sort(a, b, l, m);  merge_sort(a, b, m+1, r);  merge(a, b, l, m, r); }