对随机产生的1000个整数构成的序列分别进行直接插入、简单选择排序、希尔、快速、归并排序,并统计各自的比较次数。使用c语言,并且说明算法思想
时间: 2024-01-14 20:02:05 浏览: 72
好的,关于你的问题,我可以给你一些算法思想和示例代码,但需要注意的是,由于你并没有提供这个1000个整数的具体范围和分布情况,因此我将采用随机生成1000个0到999之间的整数作为示例。
1. 直接插入排序
算法思想:
直接插入排序是一种简单的排序算法,它的基本思想是将待排序的序列分为已排序区间和未排序区间,初始时已排序区间只包含一个元素,然后每次从未排序区间取出一个元素,将其插入到已排序区间的正确位置上,直到未排序区间为空。
示例代码:
```c
void insertionSort(int arr[], int n, int *cnt) {
int i, j, temp;
for (i = 1; i < n; i++) {
temp = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
(*cnt)++;
}
arr[j + 1] = temp;
}
}
```
2. 简单选择排序
算法思想:
简单选择排序也是一种简单的排序算法,它的基本思想是,每次从未排序区间选择一个最小的元素,将其放到已排序区间的末尾,直到未排序区间为空。
示例代码:
```c
void selectionSort(int arr[], int n, int *cnt) {
int i, j, minIndex, temp;
for (i = 0; i < n - 1; i++) {
minIndex = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
(*cnt)++;
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
```
3. 希尔排序
算法思想:
希尔排序是一种插入排序的改进算法,它的基本思想是,将待排序的序列按一定间隔分为若干个子序列,分别进行插入排序,然后逐步缩小间隔,直到间隔为1,最后进行一次直接插入排序。
示例代码:
```c
void shellSort(int arr[], int n, int *cnt) {
int i, j, gap, temp;
for (gap = n / 2; gap > 0; gap /= 2) {
for (i = gap; i < n; i++) {
temp = arr[i];
for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
arr[j + gap] = arr[j];
(*cnt)++;
}
arr[j + gap] = temp;
}
}
}
```
4. 快速排序
算法思想:
快速排序是一种分治算法,它的基本思想是,选择一个元素作为基准,然后将序列分为左右两部分,使得左半部分的元素都小于基准,右半部分的元素都大于基准,然后递归地对左右两部分进行快速排序。
示例代码:
```c
void quickSort(int arr[], int low, int high, int *cnt) {
if (low < high) {
int i = low, j = high, pivot = arr[low];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
(*cnt)++;
}
if (i < j) {
arr[i++] = arr[j];
(*cnt)++;
}
while (i < j && arr[i] < pivot) {
i++;
(*cnt)++;
}
if (i < j) {
arr[j--] = arr[i];
(*cnt)++;
}
}
arr[i] = pivot;
quickSort(arr, low, i - 1, cnt);
quickSort(arr, i + 1, high, cnt);
}
}
```
5. 归并排序
算法思想:
归并排序是一种分治算法,它的基本思想是,将待排序的序列分为若干个子序列,分别进行归并排序,然后再将已排序的子序列归并成一个有序序列。
示例代码:
```c
void merge(int arr[], int left, int mid, int right, int *cnt) {
int i = left, j = mid + 1, k = 0;
int *temp = (int *)malloc(sizeof(int) * (right - left + 1));
while (i <= mid && j <= right) {
if (arr[i] < arr[j]) {
temp[k++] = arr[i++];
(*cnt)++;
} else {
temp[k++] = arr[j++];
(*cnt)++;
}
}
while (i <= mid) {
temp[k++] = arr[i++];
(*cnt)++;
}
while (j <= right) {
temp[k++] = arr[j++];
(*cnt)++;
}
for (i = 0; i < k; i++) {
arr[left + i] = temp[i];
}
free(temp);
}
void mergeSort(int arr[], int left, int right, int *cnt) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid, cnt);
mergeSort(arr, mid + 1, right, cnt);
merge(arr, left, mid, right, cnt);
}
}
```
以上就是五种排序算法的基本思想和示例代码,注意,这里只是简单实现了算法,并没有对其进行优化和改进,因此在实际应用中可能并不是最优的选择。另外,由于每种算法的时间复杂度不同,因此比较次数也可能有所不同。
阅读全文