运用c语言代码实现 1)数据没有事先预排序,设计算法O(n(logn)2)。 2)数据事先预排序,设计算法O(nlogn)。
时间: 2024-02-05 22:11:42 浏览: 82
数据排序的几种方法(c语言实现)
1)数据没有事先预排序,设计算法O(n(logn)2):
我们可以使用归并排序的思想,先将整个数组分为两个部分,然后递归地对两个部分进行排序,最后将两个有序的部分合并成一个完整的有序序列。这里的关键点在于合并两个有序的部分时,可以使用类似归并排序的方法,将两个部分的元素进行比较,然后依次将较小的元素放入一个临时数组中,最后将临时数组中的元素复制回原数组中。
具体实现如下:
```
void merge(int arr[], int left, int mid, int right) {
int temp[right-left+1];
int i = left, j = mid+1, k = 0;
while (i <= mid && j <= right) {
if (arr[i] < arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (i = 0; i < k; i++) {
arr[left+i] = temp[i];
}
}
void merge_sort(int arr[], int left, int right) {
if (left >= right) {
return;
}
int mid = left + (right - left) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid+1, right);
merge(arr, left, mid, right);
}
void sort(int arr[], int n) {
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
merge_sort(arr, 0, n-1);
}
```
2)数据事先预排序,设计算法O(nlogn):
由于数据已经事先排序好了,所以我们可以使用二分查找的方式来寻找每个元素的位置,然后将其插入到正确的位置中。具体实现如下:
```
void insert(int arr[], int n, int num) {
int left = 0, right = n-1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
for (int i = n-1; i >= left; i--) {
arr[i+1] = arr[i];
}
arr[left] = num;
}
void sort(int arr[], int n) {
for (int i = 1; i < n; i++) {
insert(arr, i, arr[i]);
}
}
```
阅读全文