- //选择排序
- void SelectSort(int *array, int size)
- {
- for (int idx = 0; idx < size; ++idx)
- {
- int min = idx ;//假定第一个元素最小
- int tmp = idx + 1;//标记第二个元素
- while (tmp < size)//寻找最小的元素
- {
- if (array[tmp] < array[min])
- {
- min = tmp;
- }
- tmp++;
- }
- if (idx != min)
- {
- std::swap(array[min], array[idx]);
- }
- }
- }
- //冒泡排序
- void BubbleSort(int* array, int size)
- {
- int flag = 1;
- int count = 0;
- for (int idx = 0; idx < size - 1; ++idx)//控制数据向后遍历
- {
- for (int jx = 0; jx < size - idx - 1; ++jx)//两个数进行比较
- {
- if (array[jx]>array[jx + 1])
- {
- std::swap(array[jx], array[jx + 1]);
- flag = 0;
- }
- count++;//标记比较次数
- }
- if (flag == 1)//有序的不进行比较
- {
- break;
- }
- }
- }
- //递归归并排序
- void Merge(int *array, int *temp,int left, int mid, int right)//归并
- {
- int begin1 = left;//标记最左边的节点
- int end1 = mid;//标记中间的节点
- int begin2 = mid+1;//
- int end2 = right;
- int index = left;
- while (begin1 <= end1 && begin2 <= end2)
- {
- if (array[begin1] < array[begin2])
- {
- temp[index++] = array[begin1++];
- }
- else
- {
- temp[index++] = array[begin2++];
- }
- }
- while (begin1 <= end1)
- {
- temp[index++] = array[begin1++];
- }
- while (begin2 <= end2)
- {
- temp[index++] = array[begin2++];
- }
- }
- void _MergeSort(int *array,int *temp, int left, int right)
- {
- if (left < right)
- {
- int mid = left + ((right - left) >> 1);
- _MergeSort(array, temp, left, mid);
- _MergeSort(array,temp, mid + 1, right);
- Merge(array, temp,left, mid, right);
- memcpy(array + left, temp + left, sizeof(array[0])*(right - left + 1));
- }
- }
- void MergeSort(int *array, int size)
- {
- int *temp = new int [size];
- if (NULL != temp)
- {
- _MergeSort(array, temp, 0, size - 1);
- delete[]temp;
- }
- }
- //非递归归并排序
- void MergeSortNor(int *array, int size)
- {
- int* temp = new int[size];
- int left = 0;
- int right = size - 1;
- int gap = 1;
- while (gap < size)
- {
- for (size_t idx = 0; idx < size; idx += 2 * gap)
- {
- left = idx;
- int mid = idx + gap - 1;
- right = mid + gap;
- if (mid >= size)
- {
- mid = size - 1;
- }
- if (right >= size)
- {
- right = size - 1;
- }
- Merge(array, temp, left, mid, right);//归并
- }
- memcpy(array, temp, size*sizeof(int));
- gap++;
- }
- delete[]temp;
- }
- //打印排序后的序列
- void printfSort(int arr[], int count)
- {
- for (int idx = 0; idx < count; ++idx)
- {
- cout << arr[idx] << " ";
- }
- cout << endl;
- }
- void FuntTest()
- {
- //int array[] = { 1 };
- int array[] = { 21, 25, 49, 25, 0, 16 };
- //int array[] = { 7, 3, 2, 0, 1, 4 };
- //int array[] = { 2, 3, 5, 7, 9, 0, 1, 6, 4, 8 };
- int count = sizeof(array) / sizeof(array[0]);
- cout << count << endl;
- printfSort(array, count);
- //BubbleSort(array, count);//ok
- //SelectSort(array, count);//ok
- //InsertSort(array, count);
- //MergeSort(array, count);//递归归并排序
- //MergeSortNor(array, count);非递归归并排序
- printfSort(array,count);
- }
- int main()
- {
- FuntTest();
- system("pause");
- return 0;
- }