数据结构——排序

2018-08-20  本文已影响19人  我哈啊哈啊哈

目录

1、冒泡排序

2、选择排序

3、插入排序

4、希尔排序

5、归并排序

6、快速排序

7、计数排序

8、桶排序

9、基数排序

正文

1、冒泡排序

        public void BubbleSort(int[] A,int n) {
            for(int pass = n - 1; pass >= 0; pass--) {
                for (int i = 0; i < pass - 1; i++) {
                    if (A[i] > A[i + 1]) {
                        int temp = A[i];
                        A[i] = A[i + 1];
                        A[i + 1] = temp;
                    }
                }
            }
        }
        public void BubbleSortImproved(int[] A, int n) {
            int pass, i, temp, swapped = 1;
            for (pass = n - 1; pass >= 0 && swapped == 1; pass--) {
                swapped = 0;
                for (i = 0; i < pass - 1; i++) {
                    if (A[i] > A[i + 1]) {
                        temp = A[i];
                        A[i] = A[i + 1];
                        A[i + 1] = temp;
                        swapped = 1;
                    }
                }
            }
        }

2、选择排序

        public void SelectionSort(int[] A,int n) {
            int i, j, min, temp;
            for (i = 0; i < n - 1; i++) {
                min = i;
                for (j = i + 1; j < n; j++) {
                    if (A[j] < A[i]) {
                        min = j;
                    }
                }
                temp = A[min];
                A[min] = A[i];
                A[i] = temp;
            }
        }

3、插入排序

        public void InsertionSort(int[] A,int n) {
            int i, j, v;
            for (i = 0; i <=n - 1; i++) {
                v = A[i];
                j = i;
                while (j >= 1 && A[j - 1] > v ) {
                    A[j] = A[j - 1];
                    j--;
                }
                A[j] = v;
            }
        }

4、希尔排序

        public void ShellSort(int[] A,int n) {
            for(int i = n / 2; i > 0; i /= 2) {
                for(int j = i; j < n; j++) {
                    int v = j;
                    int temp = A[v];
                    if (A[v] < A[v - i]) {
                        while (v - i >= 0 && temp < A[v - i]) {
                            A[v] = A[v - i];
                            v -= i;
                        }
                        A[v] = temp;
                    }
                }
            }
        }

5、归并排序

        public void MergeSort(int[] A,int[] temp,int left,int right) {
            int mid;
            if (right > left) {
                mid = (right + left) / 2;
                MergeSort(A, temp, left, mid);
                MergeSort(A, temp, mid + 1, right);
                Merge(A,temp,left,mid+1,right);
            }
        }

        public void Merge(int[] A,int[] temp,int left,int mid,int right) {
            int i, left_end, size, temp_pos;
            left_end = mid - 1;
            temp_pos = left;
            size = right - left + 1;
            while ((left <= left_end) && (mid <= right)) {
                if (A[left] <= A[mid]) {
                    temp[temp_pos] = A[left];
                    temp_pos = temp_pos + 1;
                    left = left + 1;
                }
                else {
                    temp[temp_pos] = A[mid];
                    temp_pos = temp_pos + 1;
                    mid = mid + 1;
                }
            }
            while (left <= left_end) {
                temp[temp_pos] = A[left];
                left = left + 1;
                temp_pos = temp_pos + 1;    
            }
            while (mid <= right) {
                temp[temp_pos] = A[mid];
                mid = mid + 1;
                temp_pos = temp_pos + 1;
            }
            for(i = 0; i <= size; i++) {
                A[right] = temp[right];
                right = right - 1;
            }
        }

6、快速排序

        public void QuickSort(int[] A,int low,int high) {
            int pivot;
            if (high > low) {
                pivot = Partition(A, low, high);
                QuickSort(A,low,pivot-1);
                QuickSort(A, pivot + 1, high);
            }
        }

        public int Partition(int[] A,int low,int high) {
            int left, right, pivot_item = A[low];
            left = low;
            right = high;
            while (left < right) {
                //当item<pivot移动左指针
                while (A[left] <= pivot_item) {
                    left++;
                }
                //当item>pivot移动左右指针
                while (A[right] > pivot_item) {
                    right--;
                }
                if (left < right) {
                    //交换左右元素
                    swap(A, left, right);
                }
            }
            //right 即是枢轴的最终位置
            A[low] = A[right];
            A[right] = pivot_item;
            return right;
        }

7、计数排序

        public void CountingSort(int[] A,int n,int[] B,int k) {
            int[] C = new int[k];
            int i, j;
            for (i = 0; i < k; i++) {
                C[i] = 0;
            }
            for (j = 0; j < n; j++) {
                C[A[j]] = C[A[j]] + 1;
            }
            for (i = 1; i < k; i++) {
                C[i] = C[i] + C[i - 1];
            }
            for (j = n - 1; j >= 0; j--) {
                B[C[A[j]]] = A[j];
                C[A[j]] = C[A[j]] - 1;
            }
        }

8、桶排序

        public void BucketSort(int[] A,int array_size) {
            int i, j, k;
            int[] buckets=new int[BUCKETS];
            for (j = 0; j < BUCKETS; j++) {
                buckets[j] = 0;
            }
            for (i = 0; i < array_size; i++) {
                ++buckets[A[i]];
            }
            for (i = 0, j = 0; j < BUCKETS; j++) {
                for (k = buckets[j]; k > 0; k--) {
                    A[i++] = j;
                }
            }
        }

9、基数排序

上一篇 下一篇

猜你喜欢

热点阅读