1.关键代码段
选择排序
1 void Selectsort(int a[], int n) 2 { 3 int i, j, nMinIndex; 4 for (i = 0; i < n; i++) 5 { 6 nMinIndex = i; //找最小元素的位置 7 for (j = i + 1; j < n; j++) 8 if (a[j] < a[nMinIndex]) 9 nMinIndex = j; 10 11 Swap(a[i], a[nMinIndex]); //将这个元素放到无序区的开头 12 } 13 }
堆排序
1 // 从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2 2 void MinHeapFixdown(int a[], int i, int n) 3 { 4 int j, temp; 5 temp = a[i]; 6 j = 2 * i + 1; 7 while (j < n) 8 { 9 if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的 10 j++; 11 if (a[j] >= temp) 12 break; 13 a[i] = a[j]; //把较小的子结点往上移动,替换它的父结点 14 i = j; 15 j = 2 * i + 1; 16 } 17 a[i] = temp; 18 } 19 20 //建立最小堆 21 void MakeMinHeap(int a[], int n) 22 { 23 for (int i = n / 2 - 1; i >= 0; i--) 24 MinHeapFixdown(a, i, n); 25 print(a,10); 26 } 27 28 //最小堆排序 29 void MinheapsortTodescendarray(int a[], int n) 30 { 31 for (int i = n - 1; i >= 1; i--) 32 { 33 Swap(a[i], a[0]); 34 MinHeapFixdown(a, 0, i); 35 } 36 print(a, 10); 37 } 38 39 // 堆排序 40 void HeapSort(int a[],int n) 41 { 42 MakeMinHeap(a, n); 43 MinheapsortTodescendarray(a, n); 44 }
冒泡排序
1 void bubbleSort(int a[], int n) 2 { 3 for(int i =0 ; i< n-1; ++i) 4 { 5 for(int j = 0; j < n-1-i; ++j) //for(int j = n-1; j > i; j--) 6 { 7 if(a[j] > a[j+1]) 8 { 9 int tmp = a[j] ; 10 a[j] = a[j+1] ; 11 a[j+1] = tmp; 12 } 13 } 14 print(a,n,i); 15 } 16 }
直接插入排序
1 void Insertsort1(int a[], int n) 2 { 3 int i, j, k; 4 for (i = 1; i < n; i++) 5 { 6 //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置 7 for (j = i - 1; j >= 0; j--) 8 if (a[j] <= a[i]) //注意插入排序是稳定的,所以a[j]=a[i]时也不处理 9 break; 10 11 //如找到了一个合适的位置 12 if (j != i - 1) 13 { 14 //将比a[i]大的数据向后移 15 int temp = a[i]; 16 for (k = i - 1; k > j; k--) 17 a[k + 1] = a[k]; 18 //将a[i]放到正确位置上 19 a[k + 1] = temp; 20 } 21 } 22 }
希尔排序
1 void shellsort1(int a[], int n) 2 { 3 int i, j, gap; 4 5 for (gap = n / 2; gap > 0; gap /= 2) //步长 6 { 7 for (i = 0; i < gap; i++) //直接插入排序 8 { 9 for (j = i + gap; j < n; j += gap) 10 if (a[j] < a[j - gap]) 11 { 12 int temp = a[j]; 13 int k = j - gap; 14 while (k >= 0 && a[k] > temp) 15 { 16 a[k + gap] = a[k]; 17 k -= gap; 18 } 19 a[k + gap] = temp; 20 } 21 } 22 } 23 }
快速排序
1 //快速排序 2 void quick_sort(int s[], int l, int r) 3 { 4 if (l < r) 5 { 6 //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1 7 int i = l, j = r, x = s[l]; 8 while (i < j) 9 { 10 while(i < j && s[j] >= x) // 从右向左找第一个小于x的数 11 j--; 12 if(i < j) 13 s[i++] = s[j]; 14 15 while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数 16 i++; 17 if(i < j) 18 s[j--] = s[i]; 19 } 20 s[i] = x; 21 quick_sort(s, l, i - 1); // 递归调用 22 quick_sort(s, i + 1, r); 23 } 24 }
归并排序
1 //将有二个有序数列a[first...mid]和a[mid...last]合并。 2 void mergearray(int a[], int first, int mid, int last, int temp[]) 3 { 4 int i = first, j = mid + 1; 5 int m = mid, n = last; 6 int k = 0; 7 8 while (i <= m && j <= n) 9 { 10 if (a[i] <= a[j]) 11 temp[k++] = a[i++]; 12 else 13 temp[k++] = a[j++]; 14 } 15 16 while (i <= m) 17 temp[k++] = a[i++]; 18 19 while (j <= n) 20 temp[k++] = a[j++]; 21 22 for (i = 0; i < k; i++) 23 a[first + i] = temp[i]; 24 } 25 void mergesort(int a[], int first, int last, int temp[]) 26 { 27 if (first < last) 28 { 29 int mid = (first + last) / 2; 30 mergesort(a, first, mid, temp); //左边有序 31 mergesort(a, mid + 1, last, temp); //右边有序 32 mergearray(a, first, mid, last, temp); //再将二个有序数列合并 33 } 34 } 35 36 bool MergeSort(int a[], int n) 37 { 38 int *p = new int[n]; 39 if (p == NULL) 40 return false; 41 mergesort(a, 0, n - 1, p); 42 delete[] p; 43 return true; 44 }
基数排序
1 #include "stdafx.h" 2 #include <iostream> 3 #include <math.h> 4 using namespace std; 5 6 //查询数组中的最大数 7 int findMaxNum(int *p, int n) 8 { 9 int i; 10 int max = 0; 11 for (i = 0; i < n; i++) 12 { 13 if (*(p + i) > max) 14 { 15 max = *(p + i); 16 } 17 } 18 return max; 19 } 20 //获取数字的位数 21 int getLoopTimes(int num) 22 { 23 int count = 1; 24 int temp = num / 10; 25 while (temp != 0) 26 { 27 count++; 28 temp = temp / 10; 29 } 30 return count; 31 } 32 33 //将数字分配到各自的桶中,然后按照桶的顺序输出排序结果 34 void sort2(int *p, int n, int loop) 35 { 36 //建立一组桶此处的20是预设的根据实际数情况修改 37 int buckets[10][20] = {}; 38 //求桶的index的除数 39 //如798个位桶index=(798/1)%10=8 40 //十位桶index=(798/10)%10=9 41 //百位桶index=(798/100)%10=7 42 //tempNum为上式中的1、10、100 43 int tempNum = (int)pow(10, loop - 1); 44 int i, j; 45 for (i = 0; i < n; i++) 46 { 47 int row_index = (*(p + i) / tempNum) % 10; 48 for (j = 0; j < 20; j++) 49 { 50 if (buckets[row_index][j] == NULL) 51 { 52 buckets[row_index][j] = *(p + i); 53 break; 54 } 55 } 56 } 57 //将桶中的数,倒回到原有数组中 58 int k = 0; 59 for (i = 0; i < 10; i++) 60 { 61 for (j = 0; j < 20; j++) 62 { 63 if (buckets[i][j] != NULL) 64 { 65 *(p + k) = buckets[i][j]; 66 buckets[i][j] = NULL; 67 k++; 68 } 69 } 70 } 71 } 72 73 //基数排序 74 void bucketSort3(int *p, int n) 75 { 76 //获取数组中的最大数 77 int maxNum = findMaxNum(p, n); 78 //获取最大数的位数,次数也是再分配的次数。 79 int loopTimes = getLoopTimes(maxNum); 80 int i; 81 //对每一位进行桶分配 82 for (i = 1; i <= loopTimes; i++) 83 { 84 sort2(p, n, i); 85 } 86 } 87 void testBS() 88 { 89 int a[] = { 2, 343, 342, 1, 123, 43, 4343, 433, 687, 654, 3 }; 90 int *a_p = a; 91 //计算数组长度 92 int size = sizeof(a) / sizeof(int); 93 //基数排序 94 bucketSort3(a_p, size); 95 //打印排序后结果 96 int i; 97 for (i = 0; i < size; i++) 98 { 99 printf("%d ", a[i]); 100 } 101 } 102 103 int _tmain(int argc, _TCHAR* argv[]) 104 { 105 testBS(); 106 107 system("pause"); 108 return 0; 109 }
2.性能比较