☰
快速排序算法代码
2026/10/29 2:09:56 网站建设 项目流程

快速排序算法代码

  • 一、前言
  • 二、算法代码
    • 1、C语言(基础版)
    • 2、C语言(栈模拟)
    • 3、Java语言(基础版)
    • 4、Java语言(栈模拟)

一、前言

最近要用到快速排序的算法,这里记录一下。

二、算法代码

1、C语言(基础版)

#include<stdio.h>//打印数组元素voidprint_arr(intarr[],intn){for(inti=0;i<n;i++){printf("%d ",arr[i]);}putchar('\n');}//交换数组元素voidswap(intarr[],inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}//分区,返回基准值最终索引(基准选最右元素)intpartition(intarr[],intlow,inthigh){intpivot=arr[high];//基准值inti=low-1;//小于基准区域右边界for(intj=low;j<high;j++){if(arr[j]<=pivot){//当前元素<=基准→加入左区域i++;swap(arr,i,j);}}swap(arr,i+1,high);//基准归位returni+1;}//快速排序voidquick_sort(intarr[],intlow,inthigh,intn){print_arr(arr,n);if(low<high){intpi=partition(arr,low,high);//分区索引quick_sort(arr,low,pi-1,n);//左子数组quick_sort(arr,pi+1,high,n);//右子数组}}//入口函数intmain(){intarr[]={15,5,2,7,12,6,1,4,3,9,8,10};intlength=sizeof(arr)/sizeof(arr[0]);//计算数组长度quick_sort(arr,0,11,length);}

2、C语言(栈模拟)

#include<stdio.h>//定义栈的容量,最大100#defineMAX_STACK100//打印数组元素voidprint_arr(intarr[],intn){for(inti=0;i<n;i++){printf("%d ",arr[i]);}putchar('\n');}//交换数组元素voidswap(intarr[],inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}//分区,返回基准值最终索引(基准选最右元素)intpartition(intarr[],intlow,inthigh){intpivot=arr[high];//基准值inti=low-1;//小于基准区域右边界for(intj=low;j<high;j++){if(arr[j]<=pivot){//当前元素<=基准→加入左区域i++;swap(arr,i,j);}}swap(arr,i+1,high);//基准归位returni+1;}voidquick_sort(intarr[],intleft,intright,intn){intstack[MAX_STACK];inttop=-1;//栈空//初始区间入栈(右先左后,出栈顺序正确),先入栈right,再入栈leftstack[++top]=right;stack[++top]=left;while(top>=0){print_arr(arr,n);//取出一堆l,r,代表待排序[l,r]intl=stack[top--];intr=stack[top--];if(l>r){//如果区间无效,就跳过continue;}intpi=partition(arr,l,r);//右子区间入栈if(pi+1<r){//区间元素至少2个才需要入栈排序,减少无效任务stack[++top]=r;stack[++top]=pi+1;}//左子区间入栈if(l<pi-1){stack[++top]=pi-1;stack[++top]=l;}}}//入口函数intmain(){intarr[]={15,5,2,7,12,6,1,4,3,9,8,10};intlength=sizeof(arr)/sizeof(arr[0]);//计算数组长度quick_sort(arr,0,11,length);}

3、Java语言(基础版)

/** * 快速排序 * * @author: gan * @date: 2026-09-17 16:23 */publicclassQuickSort{privatestaticvoidprintArr(int[]arr,intn){for(inti=0;i<n;i++){System.out.printf("%d ",arr[i]);}System.out.println();}/** * 交换数组元素 * @param arr 数组 * @param i 待交换下标 * @param j 待交换下标 */privatestaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}/** * 分区:返回基准值最终索引(基准选最右元素) * @param arr 数组 * @param low 开始下标 * @param high 结束下标 * @return */privatestaticintpartition(int[]arr,intlow,inthigh){intpivot=arr[high];//基准值inti=low-1;//小于基准区域右边界for(intj=low;j<high;j++){if(arr[j]<=pivot){//当前元素<=基准→加入左区域i++;swap(arr,i,j);}}swap(arr,i+1,high);//基准归位returni+1;}/** * 递归快速排序 * @param arr 数组 * @param low 开始下标 * @param high 结束下标 */privatestaticvoidquickSort(int[]arr,intlow,inthigh){printArr(arr,arr.length);if(low<high){intpi=partition(arr,low,high);quickSort(arr,low,pi-1);quickSort(arr,pi+1,high);}}/** * 快速排序 * @param arr 数组 */publicstaticvoidquickSort(int[]arr){if(arr==null||arr.length<=1){return;}quickSort(arr,0,arr.length-1);}publicstaticvoidmain(String[]args){int[]arr={15,5,2,7,12,6,1,4,3,9,8,10};quickSort(arr);}}

4、Java语言(栈模拟)

importjava.util.ArrayDeque;importjava.util.Deque;/** * 快速排序 * * @author: gan * @date: 2026-09-17 16:23 */publicclassQuickSort{privatestaticvoidprintArr(int[]arr,intn){for(inti=0;i<n;i++){System.out.printf("%d ",arr[i]);}System.out.println();}/** * 交换数组下标 `i` 和 `j` 两个元素的值。 * @param arr 数组 * @param i 待交换元素下标 * @param j 待交换元素下标 */privatestaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}/** * 分区:返回基准值最终索引(基准选最右元素) * * 这是快速排序的核心 * * @param arr 数组 * @param low 开始下标 * @param high 结束下标 * @return */privatestaticintpartition(int[]arr,intlow,inthigh){intpivot=arr[high];//选取最右边元素作为基准值(pivot轴值)inti=low-1;//i:小于等于pivot区域的右边界//从low遍历到high - 1for(intj=low;j<high;j++){//如果当前元素小于等于pivot,就放到左边区域if(arr[j]<=pivot){i++;swap(arr,i,j);}}//循环结束后:[low ~ i] 全部 <= pivot , [i + 1 ~ high - 1] > pivot//把基准值放到中间正确位置swap(arr,i+1,high);returni+1;//返回基准值最终下标 pi}/** * 快速排序 * @param arr 数组 */publicstaticvoidquickSort(int[]arr){if(arr==null||arr.length<=1){return;}Deque<Integer>deque=newArrayDeque<>();//压栈,将初始的左右边界入栈deque.push(0);deque.push(arr.length-1);while(!deque.isEmpty()){//注意压栈顺序,前面是左后右,出栈应该是先出right,再出rightintright=deque.pop();intleft=deque.pop();if(left>=right){continue;//区间只有一个元素和者无效区间,不用排序}intpi=partition(arr,left,right);//右子区间入栈,即 pi + 1,right 入栈if(pi+1<right){deque.push(pi+1);deque.push(right);}//左子区间入栈,left, pi - 1 入栈if(left<pi-1){deque.push(left);deque.push(pi-1);}printArr(arr,arr.length);}}publicstaticvoidmain(String[]args){int[]arr={15,5,2,7,12,6,1,4,3,9,8,10};quickSort(arr);}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询