关于快速排序

关于快速排序的一些知识以及代码实现

  1. 快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
    (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
    (2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
    (3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
    (4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
  2. 代码实现:
public class QuickSort {
 public static int[] quicksort(int[] list,int start,int end) {
  int qiv=list[start];
  int i=start;
  int j=end;
  while(i<j) {
   while(i<j&&(list[j]>qiv)) {j--;}
   while(i<j&&(list[i]<qiv)) {i++;}
   if(list[i]==list[j]&&(i<j)) {i++;}
   else {
    int temp=list[i];
   list[i]=list[j];
   list[j]=temp;}
  }
  if(i-1>start) list=quicksort(list,start,i-1);
  if(j+1<end) list=quicksort(list,j+1,end);
  return list;
 }
 public static void main(String[] args) {
  int[] a=new int[] {7,9,10,6,1,2,3,4};
  int len=a.length;
  int[] result=quicksort(a,0,len-1);
  for(int m:a) {
   System.out.println(m);
  }
 }
}
快速排序是一种常用的排序算法,它的时间复杂度为 O(nlogn)。以下是快速排序的基本思想: 1. 选择一个基准元素,通常是数组的第一个元素或最后一个元素。 2. 将数组中所有小于基准元素的元素放置在基准元素左边,所有大于基准元素的元素放置在右边。 3. 对左右两个子数组重复步骤 1 和步骤 2,直到子数组的大小为 1。 以下是用 C 语言实现快速排序的代码示例: ```c #include <stdio.h> void quick_sort(int arr[], int left, int right) { int i, j, tmp, pivot; if (left < right) { i = left; j = right; pivot = arr[left]; // 基准元素选择数组的第一个元素 while (i < j) { while (i < j && arr[j] >= pivot) // 从右边开始找到小于基准元素的元素 j--; if (i < j) { tmp = arr[j]; arr[j] = arr[i]; arr[i] = tmp; i++; } while (i < j && arr[i] < pivot) // 从左边开始找到大于等于基准元素的元素 i++; if (i < j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; j--; } } arr[i] = pivot; quick_sort(arr, left, i - 1); // 递归处理左边的子数组 quick_sort(arr, i + 1, right); // 递归处理右边的子数组 } } int main() { int arr[] = {6, 2, 3, 1, 9, 10, 15, 13, 12, 17}; int n = sizeof(arr) / sizeof(arr[0]); quick_sort(arr, 0, n - 1); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 在以上代码中,quick_sort 函数用于对数组进行快速排序,left 和 right 分别表示数组的左右边界。在函数中,首先选择数组的第一个元素为基准元素 pivot,然后使用双指针 i 和 j 分别从数组的左右两端开始扫描,找到小于 pivot 的元素 arr[j] 和大于等于 pivot 的元素 arr[i],然后交换它们的位置。重复这个过程直到 i 和 j 相遇,此时将基准元素 pivot 放到 i 的位置上,然后对左右两个子数组分别递归调用 quick_sort 函数即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值