1 #include <iostream> 2 //交换函数 3 void qswap(int& p, int& q) 4 { 5 int temp = p; 6 p = q; 7 q = temp; 8 } 9 10 //选择排序 11 void Sort(int array[], int n) 12 { 13 for (int i = 0; i <n-1; ++i) 14 { 15 int min = i; 16 for (int j = i+1; j < n; ++j) 17 { 18 if (array[min] > array[j]) 19 { 20 min = j; 21 } 22 } 23 if(min!= i) 24 qswap(array[min], array[i]); 25 } 26 } 27 28 int main() 29 { 30 int ch[] = { 2,4,6,8,3,5,7,9,0,1 }; 31 bubbleSort(ch, 10); 32 int length = sizeof(ch) / sizeof(int); 33 for (int i = 0; i < length; ++i) 34 { 35 std::cout << ch[i] << " "; 36 } 37 return 0; 38 }
堆排序思想:通过将一系列数据按照完全二叉树大顶堆或小顶堆排序,然后将堆得根结点和二叉树的最后结点交换位置。交换位置后,出去最后一个元素继续按照大顶推排序。
1 #include <iostream> 2 template<class T> 3 void swap(T& a, T& b) 4 { 5 T temp = a; 6 a = b; 7 b = temp; 8 } 9 //堆排序 10 void Adiust(int arr[], int s, int m) 11 { 12 int temp = arr[s]; 13 int j = 0; 14 for (j = s * 2; j <= m; j *= 2) 15 { 16 if (j < m && arr[j] < arr[j + 1])//找出孩子的最大值下表 17 ++j; 18 if (temp > arr[j])//判断 19 break; 20 arr[s] = arr[j]; 21 s = j; 22 } 23 arr[s] = temp; 24 } 25 void HeapSort(int arr[], int n) 26 { 27 if (arr == nullptr || n<1) 28 return; 29 int s; 30 for (s = n / 2; s > 0; --s)//二叉树的双亲结点 31 { 32 Adiust(arr, s, n); 33 } 34 35 for (s = n; s > 1; --s) 36 { 37 swap(arr[1], arr[s]); 38 Adiust(arr, 1, s-1); 39 } 40 } 41 42 int main() 43 { 44 int a[] = {0,50,40,10,60,90,70,80,30 };//在a[0]位置添加一个辅助点 45 HeapSort(a, 8); 46 for (int i = 0; i < sizeof(a)/sizeof(int); ++i) 47 std::cout << a[i] << " "; 48 return 0; 49 }