void quickSort(int arr[], int left, int right){ //arr是数组,left是起始下标,right是结束下标 if(left >= right)return; int base =arr[left],l = left,r = right; while (l < r){ while (l < r && arr[r] >= base) r--; arr[l] = arr[r]; while (l< r && arr[r] <= base)l++; arr[r] = arr[l]; } arr[r] = base; quickSort(arr,left,r-1); quickSort(arr,r+1,right); } int main() { int arr[] = {4, 3, 8, 2, 1, 7, 5, 6, 9, 0}; quickSort(arr, 0, 9); //10个数字下标就是0-9 for (int i = 0; i < 10; ++i) { printf("%d ", arr[i]); } }
时间: 2024-01-23 20:02:23 浏览: 17
这是一段快速排序算法的代码实现。快速排序是一种常用的排序算法,其核心思想是选取一个基准元素,将待排序数组分为比基准元素小和比基准元素大的两部分,然后对两部分分别进行递归排序。在这段代码中,选取了数组的第一个元素作为基准元素,通过两个指针 l 和 r 分别从数组的左右两端开始扫描,将比基准元素小和大的元素分别交换到数组的左右两部分,最终将基准元素归位。然后对左右两部分分别递归调用快速排序函数,最终实现整个数组的排序。
相关问题
实现排序功能,参数为数组及排序方式
好的,我可以回答这个问题。实现排序功能可以使用不同的算法,比如冒泡排序、插入排序、选择排序、快速排序等等。排序方式可以是升序或降序。以下是一个使用快速排序实现升序排序的示例代码:
```
void quickSort(int arr[], int left, int right) {
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
/* partition */
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
quickSort(arr, left, j);
if (i < right)
quickSort(arr, i, right);
}
```
调用该函数时,传入数组及数组的起始和结束下标即可实现排序。
c语言对乱序整数序列,先用快速排序按非减序排列,再进行二分查找,查找某个元素是否存在,若存在返回匹配的第一个下标位置(从0开始),不存在返回-1。
在C语言中,你可以通过以下步骤来解决这个问题:
1. **快速排序**:
- 首先选择一个基准值(通常是第一个元素或最后一个元素)。
- 将数组分为两部分,一部分包含所有小于基准的元素,另一部分包含所有大于等于基准的元素。这个过程称为分区(partitioning)。
- 对这两部分递归地应用快速排序算法,直到每个子数组只剩下一个元素,此时整个数组就有序了。
2. **快速排序的非递归实现**:
```c
void quicksort(int arr[], int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quicksort(arr, low, pivot - 1);
quicksort(arr, pivot + 1, high);
}
}
int partition(int arr[], int low, int high) {
// ...
}
```
3. **二分查找**:
- 再次遍历已排序的数组,采用二分查找法来查找目标元素:
- 定义两个指针,`left`指向数组的起始位置,`right`指向结束位置。
- 计算中间索引 `mid`,如果中间元素正好是你想要的,那么返回它的索引;如果目标比中间大,则在左半边继续查找;如果目标小,则在右半边查找,更新`left`或`right`。
4. **查找并返回索引或-1**:
```c
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target)
return mid;
else if (arr[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return -1; // 如果找不到目标,返回-1
}
```
阅读全文