快排代码示例

第一次写快排代码,做个记录

/**
 * 归位算法逻辑
 * @author Administrator
 *
 */
public class QuickSort {
@Test
public void sortDemo(){

int[] arr = {6,1,2,5,9,3,4,7,10,8};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}


private void quickSort(int[] arr, int left, int right) {

//退出条件,当传入的参数left>right说明已left = i-1 >=i+1=right不符合逻辑,就是左侧索引大于右侧,这是不被允许的
if(left >=right){
return;
}
//left和i的值不可变更,找变量去代替他们变更
int i = left;
int j = right ;
int baseNum = arr[left];
//确保不相遇循环条件以及操作
while(i!=j){
//右侧坐标左移

while(arr[j]>baseNum&&j>i){
j--;
}
//左侧坐标右移
while(arr[i]<=baseNum&&i<j){
i++;
}
//当他们符合停留条件,交换位置
int temp = arr[i];
arr[i]= arr[j];
arr[j]=temp;
}
//走到这里说明i和j相遇了,执行基础数据归位操作
arr[left] = arr[i];
arr[i] = baseNum;
//开始递归排序
//左侧部分递归逻辑
quickSort(arr, left, i-1);
//右侧部分递归逻辑
quickSort(arr,i+1,right);
}
}

快速排序(Quicksort)是一种基于分治思想的经典排序算法,在 C 语言中非常常见。它通过选定一个“基准”元素,将数组划分为两部分,并递归地对这两部分进行排序。 下面是一个经典的 C 语言实现快排代码示例: ```c #include <stdio.h> // 交换两个数 void swap(int *a, int *b) { int t = *a; *a = *b; *b = t; } // 分区函数 int partition(int arr[], int low, int high) { int pivot = arr[high]; // 基准值 int i = (low - 1); // 指针i指向比pivot小的部分最后一个位置 for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { // 如果当前元素小于等于基准值 i++; // 移动指针i的位置 swap(&arr[i], &arr[j]); // 将较小的元素放到左边区域 } } swap(&arr[i + 1], &arr[high]); // 最终把基准值放在中间 return (i + 1); } // 快速排序主函数 void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); // 对左半边递归排序 quickSort(arr, low, pi - 1); // 对右半边递归排序 quickSort(arr, pi + 1, high); } } // 打印数组 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr)/sizeof(arr[0]); printf("排序前:\n"); printArray(arr, n); quickSort(arr, 0, n - 1); printf("排序后:\n"); printArray(arr, n); return 0; } ``` ### 算法步骤解析: 1. **选择基准**:从待排序的数据中选取一个基准点 `pivot` (这里我们选了最后一位作为基准),也可以随机化。 2. **分区操作**:调整数据使得所有小于基准值的数字都在其左侧,大于它的则在其右侧。 3. **递归调用**:分别对左右两侧子序列再次应用上述过程直到每个子序列只剩下一个或零个元素为止。 ### 性能分析: - 平均时间复杂度为 O(n log n),其中 n 表示输入大小; - 最差情况下的时间复杂度是 O(n²), 当每次划分极端不平衡时发生这种情况;但是这种最坏的情况很少见并且可以避免(例如采用三数取中等优化策略)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值